Java Socket編程之UDP
阿新 • • 發佈:2017-07-30
oid 大小 throw tar int while thread print client
UDP編程:
將要傳輸的數據定義成數據包(Datagram),在數據報中指明所要到達的Socket(主機地址和端口號),然後再將數據報發送出去。
相關操作類: DatagramPacket 數據報包
DatagramSocket 進行端到端通信的類
服務器端實現步驟:
- 創建DatagramSocket,指定端口號
- 創建DatagramPacket
- 接收客戶端發送的數據信息
- 讀取數據
客戶端實現步驟:
- 定義發送信息
- 創建DatagramPacket,包含將要發送的信息
- 創建DatagramSocket
- 發送信息
服務器端:
public class UDPServer { public static void main(String[] args) throws IOException { /* * 接收客戶端發送的數據 */ //1.創建服務器端DatagramSocket,指定端口 DatagramSocket socket=new DatagramSocket(8888); System.out.println("服務器端已經啟動,等待客戶端發送數據"); while(true){//2.創建數據報,用於接收客戶端發送的數據 byte[] data=new byte[1024];//創建字節數組指定接收的數據包大小 DatagramPacket packet=new DatagramPacket(data, data.length); //3.接收客戶端發送的數據 socket.receive(packet);//此方法在接收到數據報之前一直處於阻塞狀態 UDPThread udpthread=new UDPThread(packet,socket); udpthread.start(); } } }
Tips:在UDPServer類中每次都要重新創建一個Packet
客戶端:
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=8800; byte[] data="用戶名:admin;密碼:123".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, data2.length); //2.接收服務器響應的數據 socket.receive(packet2); //3.讀取數據 String reply=new String(data2, 0, packet2.getLength()); System.out.println("我是客戶端,服務器說:"+reply); //4.關閉資源 socket.close(); } }
UDP多線程類:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; public class UDPThread extends Thread { DatagramPacket packet=null; DatagramSocket socket=null; public UDPThread(DatagramPacket packet,DatagramSocket socket){ this.packet=packet; this.socket=socket; } public void run() { try { //4.讀取數據 String info=new String(packet.getData(), 0, packet.getLength()); System.out.println("我是服務器,客戶端說:"+info); /* * 向客戶端響應數據 */ //1.定義客戶端的地址、端口號、數據 InetAddress address=packet.getAddress(); int port=packet.getPort(); byte[] bytes="歡迎您".getBytes(); //2.創建數據報,包含響應的數據信息 DatagramPacket packet2=new DatagramPacket(bytes, bytes.length, address, port); //3.響應客戶端 socket.send(packet2); } catch (IOException e) { e.printStackTrace(); } //socket.close();不能關閉 } }
Java Socket編程之UDP