JAVA中基於UDP實現多執行緒通訊
伺服器端程式,利用DatagramSocket負責監聽埠,當客戶端發過來訊息時,伺服器端就會響應,並將訊息內容儲存到Datagrampacket物件中,並且!每一次while迴圈必須重新建立DatagramPacket物件用於儲存訊息資料。並將socket,packet物件傳送給子執行緒,由子執行緒完成後面的事務,主執行緒將進行下一次迴圈,在receive(packet)處阻塞監聽客戶端的響應。
package UDPSocketTell;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServerThreadText {
public static void main(String[] args) throws IOException { // TODO Auto-generated method stub DatagramSocket socket = new DatagramSocket(8899); byte[] infoBytes = new byte[1024]; int num = 0; System.out.println("伺服器端啟動了·········"); while (true) { DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length); socket.receive(packet); UdpServerThread thread = new UdpServerThread(packet, socket, infoBytes); thread.start(); System.out.println(thread); System.out.println("訪問的客戶端數量:" + (num++)); } }
}
在子執行緒中,由傳過來的socket和packet物件獲取到客戶端傳過來的訊息資料、埠號和InetAddress地址,將訊息資料進行輸出,並對客戶端進行響應。
package UDPSocketTell;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpServerThread extends Thread {
private String info = null;
private DatagramSocket socket = null;
private int port = 0;
private InetAddress address = null;
public UdpServerThread(DatagramPacket packet2, DatagramSocket socket2, byte[] infoBytes2) {
// TODO Auto-generated constructor stub
socket = socket2;
info = new String(infoBytes2, 0, packet2.getLength());
port = packet2.getPort();
address = packet2.getAddress();
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
System.out.println("客戶端說:" + info);
byte[] infoBytes = "你好!我是伺服器~".getBytes();
DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length, address, port);
try {
socket.send(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客戶端程式碼,只需要用DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length, address, 8899);儲存要傳送的資料,指出要傳送的目標伺服器的地址InetAddress,並用socket.send(packet);發出訊息即可。新建一個packet物件,使用socket.receive(packet2);接收伺服器的響應。
package UDPSocketTell;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 客戶端,基於UDP實現Socket通訊
*
* @author 傑仔
*
*/
public class UDPclient {
public static void main(String[] args) {
// TODO Auto-generated method stub
byte[] infoBytes = "使用者名稱2:吳俊傑;密碼2:123456".getBytes();// 建立傳送資料的位元組陣列
InetAddress address;
try {
/*
* 傳送資料包
*/
address = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length, address, 8899);
DatagramSocket socket = new DatagramSocket();
System.out.println("客戶端準備傳送資料了!");
socket.send(packet);
/*
* 接收資料包響應
*/
byte[] Bytes = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(Bytes, Bytes.length);
System.out.println("**********客戶端已經啟動************");
socket.receive(packet2);
String info = new String(Bytes, 0, packet2.getLength());
System.out.println("自己的packeg的埠號:" + packet.getPort());
System.out.println("客戶端發來訊息長度為 " + packet2.getLength() + " 的訊息:" + info + " 訊息埠號為:" + packet2.getPort());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
歡迎入門學習交流,系統收費0.1,勿在意: