使用無連接的數據報(UDP)進行通信
什么是Datagram?
數據報是網上傳輸的獨立數據包,數據報是否能正確地到達目的地,到達的時間,順序,內容的正確性均沒有保障。
Java中使用Datagram與DatagramPacket類。
DatagramSocket類利用UDP協議來實現客戶與服務器的Socket。
send()發送數據報。
receive()接收數據報。
可以用寫信寄信的例子來類比UDP通信。
此時DatagramPacket就相當於一個包裝了信封的信件。填好地址和接收人之后,就可以寄出去。
簡單的UDP通訊實例

package com.example.network; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpUnit1 { public static void main(String[] args) throws Exception { DatagramSocket datagramSocket = new DatagramSocket(); // 構造數據報的包 String str = "Hello World"; // 用了public DatagramPacket(byte buf[], int length,InetAddress address, // int port)形式 DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("localhost"), 7000); // 發送數據包 datagramSocket.send(packet); // 接收數據包 byte[] buffer = new byte[1024]; DatagramPacket packet2 = new DatagramPacket(buffer, 100); datagramSocket.receive(packet2); // 輸出接收到的數據 System.out.println(new String(buffer, 0, packet2.getLength())); datagramSocket.close(); } }

package com.example.network; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UdpUnit2 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(7000); // 收信息 byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, 1024); // 接收 socket.receive(packet); // 輸出 System.out.println(new String(buffer, 0, packet.getLength())); // 返回信息 String str = "Welcome!"; DatagramPacket packet2 = new DatagramPacket(str.getBytes(), str.length(), packet.getAddress(), packet.getPort());// 這里填入發送方的信息 socket.send(packet2); socket.close(); } }
運行時首先運行UdpUnit2,因為它開始時是在等待接收;然后運行UdpUnit1,它向UdpUnit2發送了“Hello World”的信息,UdpUnit2接收到信息后,返回“Welcome!”。
比較奇怪的一個地方就是Welcome后的感嘆號在UdpUnit1接收到並輸出后顯示的是問號。
原因不詳,(難道這就是說明UDP傳輸數據不可靠的證據?)望達人指點。
參考資料
聖思園張龍老師Java SE系列視頻教程。