效果圖:
多線程伺服器 用戶端 單線程伺服器import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPMutiThreadServer implements Runnable {
DatagramPacket datagramPacket; //資料報包
byte[] data1; //存放資料的變量
public UDPMutiThreadServer(DatagramPacket datagramPacket,byte[] data1) {
this.datagramPacket = datagramPacket;
this.data1=data1;
}
public static void main(String[] args) throws SocketException {
int count=0; //用于統計用戶端數量
DatagramSocket datagramSocket = new DatagramSocket(1234);
System.out.println("```````伺服器已經啟動,等待用戶端發送資料````````");
while (true) {
/**
* 建立資料報包,用于儲存收發的資料,需要定義資料包的大小和長度
*/
byte[] data = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(data,data.length);
try {
datagramSocket.receive(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}
if (datagramPacket.getLength() > 0) {
new Thread(new UDPMutiThreadServer(datagramPacket,data)).start();
count++;
System.out.println("用戶端的數量為:" + count);
}
}
}
@Override
public void run() {
// byte[] data=new byte[1024];
String info = new String(data1,0,datagramPacket.getLength());
System.out.println("我是伺服器,用戶端發送的資訊是:"+ info);
/**
* 響應用戶端資料
*
* 從接收的資料包中擷取用戶端的位址和端口
*/
InetAddress address = datagramPacket.getAddress();
int port = datagramPacket.getPort();
//定義響應資料
byte[] data2 = "伺服器已經收到你的資訊,謝謝!".getBytes();
//用DatagramPacket把要發送的資料進行打包
DatagramPacket datagramPacket1 = new DatagramPacket(data2,data2.length,address,port);
//用datagramSocket把資料包發送給用戶端
try {
DatagramSocket datagramSocket= new DatagramSocket();
datagramSocket.send(datagramPacket1);
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.net.*;
public class UDPClient {
public static void main(String[] args) throws IOException {
/**
* 向伺服器發送資料
*
* 定義伺服器位址,端口号和資料
*/
InetAddress address = InetAddress.getByName("localhost");
int port=1234;
byte[] data ="我是:admin123,密碼:123456546".getBytes();
/**
* 定義一個DatagramPacket,把要發送的資料時行打包
*/
DatagramPacket datagramPacket = new DatagramPacket(data,data.length,address,port);
/**
* 定義一個DatagramSocket,用于發送和接收資料
*/
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(datagramPacket);
/**
* 接收伺服器發送的資料
*/
//定義資料包的容量
byte[] daaa= new byte[1024];
DatagramPacket datagramPacket1 = new DatagramPacket(daaa,daaa.length);
//用DatagramSocket接收資料
datagramSocket.receive(datagramPacket1);
//讀取資料包的内容
String info = new String(daaa,0,datagramPacket1.getLength());
System.out.println("我是用戶端,你說:"+info);
datagramSocket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPServer {
public static void main(String[] args) throws IOException {
/**
* 接收用戶端資料
*
* 建立伺服器端的Socket,用于收發資料,需要指定端口
*/
DatagramSocket datagramSocket = new DatagramSocket(1234);
/**
* 建立資料報包,用于儲存收發的資料,需要定義資料包的大小和長度
*/
byte[] data = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(data,data.length);
System.out.println("```````伺服器已經啟動,等待用戶端發送資料````````");
/**
* 用Socket收取從用戶端發來的資料,并儲存在Packet資料報包中
*/
datagramSocket.receive(datagramPacket);
String info = new String(data,0,datagramPacket.getLength());
System.out.println("我是伺服器,用戶端發送的資訊是:"+ info);
/**
* 響應用戶端資料
*
* 從接收的資料包中擷取用戶端的位址和端口
*/
InetAddress address = datagramPacket.getAddress();
int port = datagramPacket.getPort();
//定義響應資料
byte[] data2 = "伺服器已經收到你的資訊,謝謝!".getBytes();
//用DatagramPacket把要發送的資料進行打包
DatagramPacket datagramPacket1 = new DatagramPacket(data2,data2.length,address,port);
//用datagramSocket把資料包發送給用戶端
datagramSocket.send(datagramPacket1);
}
}