平时聊天都是在同一个窗口的,所以,这个窗口同时实现发送数据和接收数据,这时就需要多线程实现。
建立一个类:
把聊天的发送端和接收端放在同一个类,启动一个窗口
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,再加优化,就可以做一个聊天室