UDP聊天(双方都可以说场景)
- UDP联调,A可以给B发消息,B也可以给A发消息。A可以收到B的消息,B也可以收到A的消息。A发送"bye"后不再发送其他消息,B发送"bye"后也不再发送其他消息。A和B双方都说了"bye"后,聊天结束
- 使用了多线程内容
发送消息线程
public class TalkSend implements Runnable{
DatagramSocket socket = null;
BufferedReader reader = null;
private int fromPort;
private String toIP;
private int toPort;
public TalkSend(int fromPort,String toIP,int toPort) throws SocketException {
this.fromPort = fromPort;
this.toIP = toIP;
this.toPort = toPort;
//1. 创建发送端口
socket = new DatagramSocket(fromPort);
reader = new BufferedReader(new InputStreamReader(System.in));
}
@Override
public void run(){
while(true){
try {
//2. 创建数据报
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));
//3. 发送数据报
socket.send(packet);
if(data.equals("byte")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
//4. 关闭socket
socket.close();
}
}
接收消息线程
public class TalkReceive implements Runnable{
DatagramSocket socket = null;
private int port;
private String msgFrom;
public TalkReceive(int port,String msgFrom) throws SocketException {
this.port = port;
this.msgFrom = msgFrom;
//1. 创建接收端口socket
socket = new DatagramSocket(port);
}
@Override
public void run(){
while(true){
try {
//2. 创建数据报
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
//3. 接收数据报
socket.receive(packet);
byte[] data = packet.getData();
String receiveData = new String(data,0, data.length);
System.out.println(msgFrom+": "+receiveData);
if(receiveData.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
//4. 关闭socket
socket.close();
}
}
学生端
public class TalkStudent {
public static void main(String[] args) throws SocketException {
new Thread(new TalkSend(7777,"localhost",9999)).start();
new Thread(new TalkReceive(8888,"老师")).start();
}
}
教师端
public class TalkTeacher {
public static void main(String[] args) throws SocketException {
new Thread(new TalkSend(5555,"localhost",8888)).start();
new Thread(new TalkReceive(9999,"学生")).start();
}
}