1. 程式人生 > >Java基於UDP實現伺服器和多客戶端之間的通訊

Java基於UDP實現伺服器和多客戶端之間的通訊

UDPServer.java

package com.zh.socket;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


/*
 * 伺服器端,基於UDP的使用者登入
 */


public class UDPServer {
public static void main(String[] args) throws IOException{
/*
 * 伺服器端接受客戶端的資料
 */
DatagramSocket socket = new DatagramSocket(6666);
System.out.println("***伺服器端即將啟動,等待客戶端連線***");
while(true){
UDPServerThread st = new UDPServerThread(socket);
st.start();
}

}


}

UDPClient.java

package com.zh.socket;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;


/*
 * 客戶端
 */


public class UDPClient {
public static void main(String[] args) throws IOException {
/*
 * 向伺服器端傳送請求
 */
//1.定義伺服器的地址,埠號,資料
InetAddress address = InetAddress.getByName("localhost");
int port = 6666;
byte[] data = "使用者名稱:zh;密碼:456".getBytes();
//2.建立資料報,包含傳送的資料資訊
DatagramPacket packet = new DatagramPacket(data,data.length,address,port);
//3.建立DatagramSocket用於資料的傳輸
DatagramSocket socket = new DatagramSocket();
//4.向伺服器端傳送資料報
socket.send(packet);
/*
 * 接收伺服器端響應的資料
 */
//1.建立資料報,用於接收伺服器端的資訊
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2,data.length);
//2.接收伺服器端的資訊
socket.receive(packet2);//在接收到響應之前,此方法會一直處於阻塞狀態
//3.讀取資訊
String reply = new String(data2,0,packet.getLength());
//4.輸出資訊
System.out.println("我是客戶端,伺服器端說:"+reply);
//5.關閉資源
socket.close();

}


}

UDPServerThread.java

package com.zh.socket;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


/*
 * 伺服器執行緒處理類
 */
public class UDPServerThread extends Thread {
/*
 * 執行緒執行的操作,響應客戶端的請求
 */
DatagramSocket socket = null;
public UDPServerThread(DatagramSocket socket){
this.socket = socket;
}
public void run(){
/*
 * 伺服器端接受客戶端的資料
 */
byte[] data = new byte[1024];//指定用於接受資料報的大小
DatagramPacket packet = new DatagramPacket(data,data.length);
try {
socket.receive(packet);//接受到資料之前該方法處於阻塞狀態
String info = new String(data,0,packet.getLength());
System.out.println("我是伺服器,客戶端說:"+info);
/*
 * 伺服器端向客戶端進行響應
 */
//1.定義客戶端的地址,埠號,資料
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "歡迎您!".getBytes();
//2.建立資料報,包含相應資訊
DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port);
//3.響應客戶端
socket.send(packet2);
//注意這裡不能關閉socket,因為在UDPServer類的while是死迴圈,無法重新建立socket,所以這裡不能關閉socket,否則無法進行下一個客戶端的監聽
} catch (IOException e) {
e.printStackTrace();
}

}
}