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();
}
}
}
}