Java 模擬基於UDP的Socket通訊
摘要:
效果圖:
多執行緒伺服器
客戶端
單執行緒伺服器
多執行緒伺服器
import java.io.IOException;
import java.net....
效果圖:

多執行緒伺服器

客戶端

單執行緒伺服器
多執行緒伺服器
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); } }