有時候需要一個客戶端向多個地址發送數據並接收返回的需求
1、創建DatagramSocket
DatagramSocket 有多個構造方法
DatagramSocket():創建一個DatagramSocket實例,並將該對象綁定到本機默認IP地址、本機所有可用端口中隨機選擇的某個端口。
DatagramSocket(int prot):創建一個DatagramSocket實例,並將該對象綁定到本機默認IP地址、指定端口。
DatagramSocket(int port, InetAddress laddr):創建一個DatagramSocket實例,並將該對象綁定到指定IP地址、指定端口。
通過上面三個構造器中的任意一個構造器即可創建一個DatagramSocket實例,但是我們目的是需要向不同的地址發送數據,所以我們使用第一種構造方法
DatagramSocket mSocket = new DatagramSocket
2、發送數據
//需要發送的數據 byte[]datas = "data" //hostIP 需要發送的地址 InetAddress address = InetAddress.getByName(hostIP); //需要發送的數據包,hostPort 發送的端口 DatagramPacket packet = new DatagramPacket(datas, datas.length, address, hostPort); //發送數據 mSocket.send(packet);
往不同的服務器發送數據,只需要啓動多個線程,調用上面的方法,替換地址和端口即可
//connect方法的意思是將socket與指定地址綁定,綁定成功後只能往該地址發送數據。並不是建立連接,因爲udp是面向非連接的 mSocket.connect(address, hostPort);
3、接收數據
//持續接收數據 while(!mStop){ byte datas[] = new byte[256]; DatagramPacket packet = new DatagramPacket(datas, datas.length); mSocket.receive(packet);//阻塞調用,直到返回數據 String receiveMsg = new String(packet); }
使用DatagramSocket發送數據報時,DatagramSocket並不知道將該數據報發送到哪裏,而是由DatagramPacket自身決定數據報的目的地。接收數據時,DatagramPacket並沒有指定地址,默認所有地址的包都能接收。