package org.westos.基于多线程的UDP编程聊天室;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Room {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
DatagramSocket dss = new DatagramSocket(10110);
InetAddress add = InetAddress.getByName("DESKTOP-2N4QT71");
SendThread st = new SendThread(ds, add);
ReceiveThread rt = new ReceiveThread(dss);
Thread sendt = new Thread(st);
Thread receivet = new Thread(rt);
sendt.start();
receivet.start();
}
}
package org.westos.基于多线程的UDP编程聊天室;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendThread implements Runnable {
// 创建带参构造,用来接收与主线程进行通信,接收主线程中的DatagramSocket对象
private DatagramSocket ds;
private InetAddress add;
public SendThread(DatagramSocket ds, InetAddress add) {
this.add = add;
this.ds = ds;
}
@Override
public void run() {
// 创建录入数据的流对象
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
try {
// 使用循环可以不断输入
while ((str = br.readLine()) != null) {// br.readline时可以录入键盘数据
// 退出循环代码块
if ("over".equals(str)) {
break;
}
byte[] by = str.getBytes();
// 创建数据包对象
DatagramPacket dp = new DatagramPacket(by, by.length, add, 10110);
// 发送数据
ds.send(dp);
}
// 关闭Socket对象
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package org.westos.基于多线程的UDP编程聊天室;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveThread implements Runnable {
// 创建带参构造,用来接收与主线程进行通信,接收主线程中的DatagramSocket对象
private DatagramSocket ds;
public ReceiveThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
// 服务器端一直处于接收数据状态,死循环
while (true) {
try {
// 创建接收数据的数据报包对象
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by, by.length);
// 接收数据
ds.receive(dp);
// 解析数据
String ip = dp.getAddress().getHostAddress();
by = dp.getData();
String str = new String(by, 0, by.length);
// 输出数据
System.out.println("from" + ip + "data is:" + str);
// System.out.println(str+ "消息来自于"+ip);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}