首页 > 代码库 > java 25 - 5 网络编程之多线程实现聊天室

java 25 - 5 网络编程之多线程实现聊天室

平时聊天都是在同一个窗口的,所以,这个窗口同时实现发送数据和接收数据,这时就需要多线程实现。

 

建立一个类:

  把聊天的发送端和接收端放在同一个类,启动一个窗口

 1 public class CharRoom { 2  3     public static void main(String[] args) throws IOException { 4              5             //创建socket发送对象和接收对象 6         DatagramSocket send = new DatagramSocket(); 7         DatagramSocket receive = new DatagramSocket(10010); 8          9         //用多线程同时运行2个10         SendThread st = new SendThread(send);11         ReceiveThread rt = new ReceiveThread(receive);12         13         Thread stThread = new Thread(st);14         Thread rtThread = new Thread(rt);15         16         //启动线程17         stThread.start();18         rtThread.start();19         20         21     }

 

再建立发送类:

  

 1 public class SendThread implements Runnable { 2  3     // 构造传参 4     private DatagramSocket ds; 5  6     public SendThread(DatagramSocket ds) { 7         this.ds = ds; 8     } 9 10     public void run() {11 12         try {13 14             // 键盘输入的内容,进行数据打包15             // 创建键盘输入对象,IO流16             BufferedReader br = new BufferedReader(new InputStreamReader(17                     System.in));18             // 读取输入的数据19             String line = null;20             while ((line = br.readLine()) != null) {21                 // 设定退出条件22                 if (line.endsWith("886")) {23                     break;24                 }25 26                 // String转换成byte,打包27                 byte[] bys = line.getBytes();28                 // 发送数据29                 DatagramPacket dp = new DatagramPacket(bys, bys.length,30                         InetAddress.getByName("172.19.xx.xxx"), 10010);31 32                 ds.send(dp);33 34             }35                 // 释放资源36                 ds.close();37 38         }39             // 处理异常40             catch (IOException e) {41                 e.printStackTrace();42             }43     }44 }

 

接收端:(要一直启动,所以无需释放资源)

 1 public class ReceiveThread implements Runnable { 2  3     // 构造方法接收 4     private DatagramSocket ds; 5  6     public ReceiveThread(DatagramSocket ds) { 7         this.ds = ds; 8     } 9 10     // 接收数据11     public void run() {12 13         try {14             // 接收端一直启动15             while (true) {16                 // 创建数据包17                 byte[] bys = new byte[1000];18                 DatagramPacket dp = new DatagramPacket(bys, bys.length);19 20                 // 接收数据包21                 ds.receive(dp);22 23                 // 解析数据包24                 String result = new String(dp.getData(), 0, dp.getLength());25                 // 获取发送端的机器名称26                 String name = dp.getAddress().getHostName();27 28                 // 打印到控制台29                 System.out.println("从" + name + "发送: " + result);30             }31         }32         // 处理异常33         catch (IOException e) {34             e.printStackTrace();35         }36 37     }38 }

 

根据这些,建立GUI,再加优化,就可以做一个聊天室

java 25 - 5 网络编程之多线程实现聊天室