標籤:new 操作 unknown nts read 線程 exce close reply
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