工具类
TalkSend 发送数据报;TalkReceive 接收数据报
TalkSend
public class TalkSend{
int fromPort;
int toPort;
String toAddress;
DatagramSocket datagramSocket = null;
//准备数据: 控制台读取 System.in
BufferedReader bufferedReader = null;
public TalkSend(int fromPort, int toPort, String toAddress) {
this.fromPort = fromPort;
this.toPort = toPort;
this.toAddress = toAddress;
try {
this.datagramSocket = new DatagramSocket(this.fromPort);
} catch (SocketException e) {
e.printStackTrace();
}
this.bufferedReader = new BufferedReader(new InputStreamReader(System.in));
}
public void send() throws IOException {
while(true){
//从字符流中读取数据
String data = null;
try {
data = bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
//数据的byte数组形式 传输的数据范围 目标传输地址 目标传输端口
DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(), 0, data.getBytes().length, new InetSocketAddress(this.toAddress, this.toPort));
try {
datagramSocket.send(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}
if ("bye".equals(data)){
break;
}
}
datagramSocket.close();
bufferedReader.close();
}
}
TalkReceive
public class TalkReceive{
String sender;
int port;
DatagramSocket datagramSocket = null;
public TalkReceive(String sender, int port) {
this.sender = sender;
this.port = port;
try {
this.datagramSocket = new DatagramSocket(this.port);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void receive() {
while (true){
//用于接收数据的byte数组
byte[] byteData = new byte[1024];
//创建用于接收数据的数据包裹
DatagramPacket datagramPacket = new DatagramPacket(byteData, 0, byteData.length);
//阻塞式接收数据
try {
datagramSocket.receive(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}
byte[] data = datagramPacket.getData();
String stringData = new String(data, 0, data.length);
System.out.println(sender + ": " +stringData);
//断开连接
/*
trim() 方法用于删除字符串的头尾空白符
若不进行trim()处理 则offData与"bye"长度不相等 equals永远为false
*/
if ("bye".equals(stringData.trim())){
break;
}
}
datagramSocket.close();
}
}
聊天客户端
TalkStudent 学生端;TalkTeacher 教师端
TalkStudent
public class TalkStudent {
public static void main(String[] args) {
//学生用7001端口向教师的8002端口发送消息
TalkSend talkSend = new TalkSend(7001, 8002, "localhost");
//学生用8001端口接收教师发送的消息
TalkReceive talkReceive = new TalkReceive("Teacher", 8001);
Thread threadSend = new Thread(() -> {
try {
talkSend.send();
} catch (IOException e) {
e.printStackTrace();
}
});
Thread threadReceive = new Thread(talkReceive::receive);
threadSend.start();
threadReceive.start();
}
}
TalkTeacher
public class TalkTeacher {
public static void main(String[] args) {
//教师从7002端口向学生的8001端口发送消息
TalkSend talkSend = new TalkSend(7002, 8001, "localhost");
//教师用8002端口接收学生发送的消息
TalkReceive talkReceive = new TalkReceive("Student", 8002);
Thread threadSend = new Thread(() -> {
try {
talkSend.send();
} catch (IOException e) {
e.printStackTrace();
}
});
Thread threadReceive = new Thread(talkReceive::receive);
threadSend.start();
threadReceive.start();
}
}
运行效果
启动聊天客户端并进行聊天
输入 bye 结束聊天