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,再加优化,就可以做一个聊天室

posted @ 2016-10-15 14:38  卡拉瓦  阅读(507)  评论(0编辑  收藏  举报