在java网络编程中,UDP通信协议的时候,不会有特别明显的C/S设计模式,用网络编程中的UDP写一个简易的聊天室
发送端
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
*@Arthur xiao_bai
*@date 2021-03-09 10:28
*/
public class Thread_UDP_Sender implements Runnable {
DatagramSocket socket = null;
BufferedReader reader = null;
//从哪个端口发送
private int fromPort;
private int toPort;
private String toIP;
public Thread_UDP_Sender(int fromPort, int toPort, String toIP) {
this.fromPort = fromPort;
this.toPort = toPort;
this.toIP = toIP;
try{
socket = new DatagramSocket(this.fromPort);
reader = new BufferedReader(new InputStreamReader(System.in));
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try{
String readLine = reader.readLine();
DatagramPacket packet = new DatagramPacket(readLine.getBytes(), 0, readLine.getBytes().length, InetAddress.getByName(this.toIP), this.toPort);
socket.send(packet);
if (readLine.equals("bye")){
break;
}}catch (Exception e){
e.printStackTrace();
}
}
socket.close();
}
}
接收方
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
*@Arthur xiao_bai
*@date 2021-03-09 10:28
*/
public class Thread_UDP_receive implements Runnable {
DatagramSocket socket = null;
//接受的端口
private int fromPort;
//从哪里来的name
private String fromName;
public Thread_UDP_receive(int fromPort,String fromName) {
this.fromPort = fromPort;
this.fromName = fromName;
try {
socket = new DatagramSocket(fromPort);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
//保存数据
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, 0, data.length);
socket.receive(packet); //阻塞式
String serverData = new String(data, 0, packet.getLength());
System.out.println(fromName + ":" + serverData);
if (serverData.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
创建Student线程发送和接收消息
/*
*@Arthur xiao_bai
*@date 2021-03-10 9:00
*/
public class Talk_Student {
public static void main(String[] args) {
//首先先创建学生的发送线程,设置发送的端口是7777, 发送对方的端口和发送的对方的IP
new Thread(new Thread_UDP_Sender(7777,9999,"localhost")).start();
//接受老师发送的端口
new Thread(new Thread_UDP_receive(8888,"老师")).start();
}
}
创建Teacher线程发送和接收消息
/*
*@Arthur xiao_bai
*@date 2021-03-10 9:00
*/
public class Talk_Teacher {
public static void main(String[] args) {
//创建老师的发送线程,设置发送的端口是5555, 发送对方的端口8888和发送的对方的IP "localhost"
new Thread(new Thread_UDP_Sender(5555,8888,"localhost")).start();
//接受学生发送的端口
new Thread(new Thread_UDP_receive(9999,"学生")).start();
}
}
效果图
学生端
老师端