UDP網絡程式設計之多線程優化——DatagramSocket類
1、UDP網絡程式設計之多線程優化的思想
(1)一個線程實作用戶端——發送資料
(2)一個線程實作伺服器端——接收資料
(3)在控制台顯示解析出來的資料
2、UDP網絡程式設計之多線程優化
(1)發送資料端的線程——用戶端線程
package cn.itcast_05;
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 {
private DatagramSocket ds;
public SendThread(DatagramSocket ds) {
this.ds = ds;
}
@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.12.255"), 12306);
// 發送資料
ds.send(dp);
}
// 釋放資源
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)接收資料端的線程——伺服器端線程
package cn.itcast_05;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveThread implements Runnable {
private DatagramSocket ds;
public ReceiveThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
while (true) {
// 建立一個包裹
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
// 接收資料
ds.receive(dp);
// 解析資料
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(),0,dp.getLength());
System.out.println("from " + ip + " data is : " + s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
(3)通過多線程改進剛才的聊天程式,這樣我們就可以實作在一個視窗發送和接收資料了
package cn.itcast_05;
import java.io.IOException;
import java.net.DatagramSocket;
/*
* 通過多線程改進剛才的聊天程式,這樣我就可以實作在一個視窗發送和接收資料了
*/
public class ChatRoom {
public static void main(String[] args) throws IOException {
DatagramSocket dsSend = new DatagramSocket();
DatagramSocket dsReceive = new DatagramSocket(12306);
SendThread st = new SendThread(dsSend);
ReceiveThread rt = new ReceiveThread(dsReceive);
Thread t1 = new Thread(st);
Thread t2 = new Thread(rt);
t1.start();
t2.start();
}
}