12.6-全栈Java笔记:Java网络编程(四)
admin
2023-03-17 18:41:07
0

上节回顾:在学习了Socket建立客户端和服务器双向交流后,我们发现它的问答形式不够灵活。

本节课我们讲解如何在服务器和客户端之间实现聊天室~

需要思考的问题:

服务器端:一个线程专门发送消息,一个线程专门接收消息。

客户端:一个线程专门发送消息,一个线程专门接收消息。

除了消化这段代码外,还需要思考,怎么实现一个聊天室!(难度较大!!)

【示例1】聊天室服务器端

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

 

public class ChatServer {

   

    public static void main(String[]   args)  {

       ServerSocket server=null;

       Socket socket=null;

       BufferedReader in=null;

       try {

           server = new ServerSocket(8888);

           socket=server.accept();

           new ServerThread(socket).start();

          

           //main线程负责读取客户端发来的信息

           in=new BufferedReader(new   InputStreamReader(socket.getInputStream()));

           while(true){

              String str=in.readLine();

              System.out.println("客户端说:"+str);

           }

       } catch (IOException e) {

           e.printStackTrace();

       }finally{

           try {

              in.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

           try {

              socket.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

          

       }

          

    }

}

 

/**

 * 专门向客户端发送消息的线程

 * @author Administrator

 *

 */

class ServerThread extends Thread {

    Socket ss;

    BufferedWriter out;

    BufferedReader br;

    public ServerThread(Socket ss){

       this.ss = ss;

       try {

           out=new BufferedWriter(new   OutputStreamWriter(ss.getOutputStream()));

           br = new BufferedReader(new   InputStreamReader(System.in));      

       } catch (IOException e) {

           e.printStackTrace();

       }

    }

    public void run(){

       try {

           while(true){

              String str2 = br.readLine();

              out.write(str2+"\n");

              out.flush();  

           }

       } catch (IOException e) {

           e.printStackTrace();

       }finally{

           try {

              out.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

           try {

              br.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

       }

      

    }

}

 

【示例2】聊天室客户端

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

 

public class ChatClient {

    public static void main(String[] args) {

       Socket  socket = null;  

       BufferedReader in = null;

       try {

           socket=new Socket(InetAddress.getByName("192.168.1.32"),8888);  

           new ClientThread(socket).start();

           in=new BufferedReader(new   InputStreamReader(socket.getInputStream()));

 

           //main线程负责接收服务器发来的信息

           while(true){

               System.out.println("服务器说:"+in.readLine());  

           }

          

       } catch (UnknownHostException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }finally{

           try {

              socket.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

          

           try {

              in.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

       }

      

    }

}  

 

/**

 * 用于向服务器发送消息

 * @author Administrator

 *

 */

class ClientThread extends Thread{

    Socket s;

    BufferedWriter out;

    BufferedReader wt;

    public ClientThread(Socket s){

       this.s = s;

       try {

           out=new BufferedWriter(new   OutputStreamWriter(s.getOutputStream()));

           wt=new BufferedReader(new   InputStreamReader(System.in));

       } catch (IOException e) {

           e.printStackTrace();

       }

      

    }

    public void run(){

           try {

              while(true){

                  String str = wt.readLine();

                  out.write(str+"\n" );

                  out.flush();

              }

           } catch (IOException e) {

              e.printStackTrace();

           }finally{

              try {

                  wt.close();

              } catch (IOException e) {

                  e.printStackTrace();

              }

               try {

                  out.close();

              } catch (IOException e) {

                  e.printStackTrace();

              }

           }

    }

}





「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。


 笔记包含从浅入深的六大部分:

 A-Java入门阶段

 B-数据库从入门到精通

 C-手刃移动前端和Web前端

 D-J2EE从了解到实战

 E-Java高级框架精解

 F-Linux和Hadoop 




相关内容

热门资讯

浏阳烟花厂爆炸事故是如何发生的... 2026年5月4日下午,湖南长沙浏阳市华盛烟花制造燃放有限公司车间发生爆炸,造成重大人员伤亡,湖南省...
新质生产力企业组团入琼 加速布... 海口5月9日电 (记者 符宇群)“我们希望将公司海洋具身智能技术,与海南得天独厚的海域资源进行深度场...
碳讨|AI涌入电力系统:谁在积... 当新能源装机不断逼近火电,“人工智能+电力”正从概念走向现实。 五大发电集团年报显示,清洁能源装机仍...
继德国后,特朗普瞄准意大利 新华社罗马5月9日电(记者王奕涵 刁泽) 据意大利媒体9日报道,美国总统特朗普接受意《晚邮报》电话采...
看人下菜碟,中国绝不当冤大头 2026年世界杯开赛在即,国际足联(FIFA)却向中国“狮子大开口”,要求支付巨额转播费用。国际足联...
特朗普还有一场硬仗 新华社北京5月9日电 美国民主、共和两党当前正推动有利本党的国会选区重划,并为此大打官司。弗吉尼亚州...
美国佛州发生疑似船只爆炸事故,... 当地时间5月9日,总台记者获悉,美国佛罗里达州迈阿密海滩附近一处热门水上聚会区域发生疑似船只爆炸事故...
【快看】涉及手机、电脑、电视等... 工业和信息化部、商务部、市场监管总局等部门近日联合启动实施《人工智能终端智能化分级》系列国家标准。 ...
中锂电取得锂电池安全保护装置专... 国家知识产权局信息显示,浙江中锂电科技有限公司取得一项名为“一种锂电池安全保护装置”的专利,授权公告...
奥特曼“官宣” OpenAI ... 文 | AI唱反调 今早,奥特曼发布了一条 X,几乎坐实了近半个月来的传闻。 X正文只有三个词:“...