11.UDP多线程在线咨询
两个人都可以是发送方,也都可以是接收方!
1 package com.Inet.chat; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.net.DatagramPacket; 7 import java.net.DatagramSocket; 8 import java.net.InetSocketAddress; 9 import java.net.SocketException; 10 11 public class TalkSend implements Runnable { 12 DatagramSocket socket = null; 13 BufferedReader reader = null; 14 15 private int fromPort; 16 private String toIP; 17 private int toPort; 18 19 public TalkSend(int fromPort, String toIP, int toPort) { 20 this.fromPort = fromPort; 21 this.toIP = toIP; 22 this.toPort = toPort; 23 try { 24 socket = new DatagramSocket(fromPort); 25 reader = new BufferedReader(new InputStreamReader(System.in)); 26 } catch (SocketException e) { 27 e.printStackTrace(); 28 } 29 30 } 31 32 @Override 33 public void run() { 34 while (true) { 35 String data = null; 36 try { 37 data = reader.readLine(); 38 byte[] datas = data.getBytes(); 39 DatagramPacket packet = new DatagramPacket(datas, 0, data.length(), new InetSocketAddress(toIP, toPort)); 40 41 socket.send(packet); 42 if (data.equals("bye")) { 43 break; 44 } 45 } catch (IOException e) { 46 e.printStackTrace(); 47 } 48 } 49 socket.close(); 50 } 51 }
1 package com.Inet.chat; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.SocketException; 7 8 public class TalkReceive implements Runnable { 9 DatagramSocket socket = null; 10 private int port; 11 private String msgFrom; 12 13 public TalkReceive(int port, String msgFrom) { 14 this.port = port; 15 this.msgFrom = msgFrom; 16 try { 17 socket = new DatagramSocket(port); 18 } catch (SocketException e) { 19 e.printStackTrace(); 20 } 21 } 22 23 @Override 24 public void run() { 25 while (true) { 26 try { 27 //准备接收包裹 28 byte[] container = new byte[1024]; 29 DatagramPacket packet = new DatagramPacket(container, 0, container.length); 30 socket.receive(packet); 31 32 //断开连接 33 byte[] data = packet.getData(); 34 String receiveData = new String(data, 0, data.length); 35 36 System.out.println(msgFrom + ":" + receiveData); 37 38 if (receiveData.equals("bye")) { 39 break; 40 } 41 } catch (IOException e) { 42 e.printStackTrace(); 43 } 44 } 45 socket.close(); 46 } 47 }
学生:
1 package com.Inet.chat; 2 3 public class TalkStudent { 4 public static void main(String[] args) { 5 //开启两个线程 6 new Thread(new TalkSend(7777, "localhost", 9999)).start(); 7 new Thread(new TalkReceive(8888, "老师")).start(); 8 } 9 }
老师:
1 package com.Inet.chat; 2 3 public class TalkTeacher { 4 public static void main(String[] args) { 5 //开启两个线程 6 new Thread(new TalkSend(5555, "localhost", 8888)).start(); 7 new Thread(new TalkReceive(9999, "学生")).start(); 8 } 9 }
最后检查一遍:
为了方便测试,在黑窗口打开对应的学生端,IDEA打开老师端: