java 多线程实现在线咨询(udp)
这篇文章主要介绍了java 多线程实现在线咨询(udp)的示例,帮助大家更好的理解和学习Java 网络编程的相关内容,感兴趣的朋友可以了解下!
在线咨询:两个人都可以是发送方,也可以是接收方,实现网上在线咨询正常通信。
聊天发送线程
1 package chat; 2 import java.io.BufferedReader; 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 import java.net.DatagramPacket; 6 import java.net.DatagramSocket; 7 import java.net.InetSocketAddress; 8 import java.net.SocketException; 9 /** 10 * 聊天发送线程: 11 * 重写 run 方法通过 implements 关键字实现 Runnable 接口 12 * 重写方法快捷键:Ctrl + O 13 */ 14 public class TalkSend implements Runnable { 15 DatagramSocket socket = null; 16 BufferedReader reader = null; 17 private int fromPort; //从哪个端口 18 private String toIP; //到哪个地址 19 private int toPort; //到哪个端口 20 //构造:Alt + Insert 21 public TalkSend(int fromPort, String toIP, int toPort) { 22 this.fromPort = fromPort; 23 this.toIP = toIP; 24 this.toPort = toPort; 25 //快捷键:Ctrl + Alt + T 26 try { 27 //构造一个数据报套接字并将其绑定到本地主机上的指定端口 28 socket = new DatagramSocket(fromPort); 29 //准备数据:控制台读取:System.in 30 reader = new BufferedReader(new InputStreamReader(System.in)); 31 } catch (SocketException e) { 32 e.printStackTrace(); 33 } 34 } 35 @Override 36 public void run() { 37 while (true){ 38 try { 39 String data = reader.readLine(); 40 byte[] dataBytes = data.getBytes(); 41 DatagramPacket packet = new DatagramPacket(dataBytes, 0 , dataBytes.length, new InetSocketAddress(this.toIP, this.toPort)); 42 //发送数据包 43 socket.send(packet); 44 //当发送一句 bye 的时候表示结束发送 45 if (data.equals("bye")){ 46 break; 47 } 48 } catch (IOException e) { 49 e.printStackTrace(); 50 } 51 } 52 //关闭 53 socket.close(); 54 } 55 }
聊天接收线程
1 package chat; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.SocketException; 7 8 /** 9 * 聊天接收线程: 10 * 重写 run 方法通过 implements 关键字实现 Runnable 接口 11 * 重写方法快捷键:Ctrl + O 12 */ 13 public class TalkReceive implements Runnable { 14 15 DatagramSocket socket = null; 16 17 private int port; 18 private String msgFrom; 19 20 //构造 21 public TalkReceive(int port, String msgFrom) { 22 this.port = port; 23 this.msgFrom = msgFrom; 24 25 try { 26 socket = new DatagramSocket(port); 27 } catch (SocketException e) { 28 e.printStackTrace(); 29 } 30 } 31 32 @Override 33 public void run() { 34 35 while (true){ 36 try { 37 //准备接收数据包 38 byte[] container = new byte[1024]; 39 DatagramPacket packet = new DatagramPacket(container, 0, container.length); 40 41 //接收数据包 42 socket.receive(packet); //阻塞式接收包裹 43 44 //读取数据 45 byte[] data = packet.getData(); 46 47 String receiveData = new String(data, 0, data.length); 48 49 //接收到的数据 50 System.out.println(msgFrom + ":" + receiveData); 51 52 //当我们说一声 bye 的时候就表示断开连接 53 if (receiveData.equals("bye")){ 54 break; 55 } 56 } catch (IOException e) { 57 e.printStackTrace(); 58 } 59 } 60 61 //关闭 62 socket.close(); 63 64 } 65 }
学生端
1 package chat; 2 3 /** 4 * 学生端 5 */ 6 public class TalkStudent { 7 8 public static void main(String[] args) { 9 10 /** 11 * 学生端 12 * 从 7777 端口发送消息 13 * 发送消息到 9999 端口 14 * 从 8888 端口接收消息 15 * 16 * 开启两个线程: 17 * new TalkSend:从 77777 端口发送,发送到 localhost,发送给 9999 端口 18 * @param fromPort 19 * @param toIP 20 * @param toPort 21 * 22 * new TalkReceive:从 8888 端口接收,接收来自 “老师” 的消息 23 * @param port 24 * @param msgFrom 25 * 26 * 使用了一种模式:静态代理模式 27 */ 28 new Thread(new TalkSend(7777, "localhost", 9999)).start(); 29 new Thread(new TalkReceive(8888, "老师")).start(); 30 } 31 32 }
老师端
1 package chat; 2 3 /** 4 * 老师端 5 */ 6 public class TalkTeacher { 7 8 public static void main(String[] args) { 9 10 /** 11 * 老师端 12 * 从 5555 端口发送消息 13 * 发送消息到 8888 端口 14 * 从 9999 端口接收消息 15 * 16 * 开启两个线程: 17 * new TalkSend:从 5555 端口发送,发送到 localhost,发送给 8888 端口 18 * @param fromPort 19 * @param toIP 20 * @param toPort 21 * 22 * new TalkReceive:从 9999 端口接收,接收来自 “学生” 的消息 23 * @param port 24 * @param msgFrom 25 * 26 * 使用了一种模式:静态代理模式 27 */ 28 new Thread(new TalkSend(5555, "localhost", 8888)).start(); 29 new Thread(new TalkReceive(9999, "学生")).start(); 30 } 31 32 }
效果一览



浙公网安备 33010602011771号