Socket —— 通過多執行緒簡單模擬了聊天室
阿新 • • 發佈:2019-02-07
/**
* Created by Liwei on 2016/7/17.
* 模擬一個簡單的聊天室程式
* 通過多執行緒改進剛開的聊天程式,這樣我們就可以實現在一個視窗傳送和接收資料了
*/
public class MainChatRoom {
public static void main(String[] args) throws SocketException {
// 作為傳送端的 Socket
DatagramSocket dsSend = new DatagramSocket();
// 作為接收端的 Socket ,要指定埠
DatagramSocket dsReceive = new DatagramSocket(10086);
SendThread sendThread = new SendThread(dsSend);
ReceiveThread receiveThread = new ReceiveThread(dsReceive);
Thread t1 = new Thread(sendThread);
Thread t2 = new Thread(receiveThread);
t1.start();
t2.start();
}
}
傳送端執行緒:
public class SendThread implements Runnable {
private DatagramSocket datagramSocket;
/**
* 通過構造方法接收外部傳遞進來的 Socket 物件
* @param datagramSocket
*/
public SendThread(DatagramSocket datagramSocket){
this.datagramSocket = datagramSocket;
}
@Override
public void run () {
try {
// 封裝鍵盤錄入資料
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine())!=null){
if("886".equals(line)){
break;
}
byte[] bys = line.getBytes();
DatagramPacket dp =
new DatagramPacket(bys,bys.length, InetAddress.getByName("192.168.100.112"),10086);
// 傳送資料
datagramSocket.send(dp);
}
// 釋放資源
datagramSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收端執行緒:
public class ReceiveThread implements Runnable {
private DatagramSocket datagramSocket;
public ReceiveThread(DatagramSocket datagramSocket) {
this.datagramSocket = datagramSocket;
}
@Override
public void run() {
try {
byte[] bys = new byte[1024];
while (true) {
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 接收資料
datagramSocket.receive(dp);
// 解析資料
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println("從 ip "+ ip + " 接收到資料:" + data);
}
} catch (IOException e) {
e.printStackTrace();
}
// 接收端,不要關閉 Socket
}
}