更新時間:2022-07-29 11:46:34 來源:動力節點 瀏覽1430次
動力節點小編來為大家介紹Java udp通信指南。
在本文中,我們將探索通過用戶數據報協議 ( UDP ) 與 Java 進行的網絡通信。
UDP 是一種通信協議,它通過網絡傳輸獨立的數據包,不保證到達,也不保證傳送的順序。
UDP 與更常見的 TCP 完全不同。但在考慮 UDP 的表面缺點之前,重要的是要了解缺乏開銷可以使其比 TCP 快得多。
除了速度之外,我們還需要記住,某些類型的通信不需要 TCP 的可靠性,而是重視低延遲。該視頻是一個很好的應用程序示例,它可能受益于通過 UDP 而不是 TCP 運行。
構建 UDP 應用程序與構建 TCP 系統非常相似;唯一的區別是我們不在客戶端和服務器之間建立點對點連接。
設置也非常簡單。Java 附帶了對 UDP 的內置網絡支持——它是java.net包的一部分。因此,要通過 UDP 執行網絡操作,我們只需要從java.net包中導入Java類:java.net.DatagramSocket和java.net.DatagramPacket。
在接下來的部分中,我們將學習如何設計通過 UDP 進行通信的應用程序;我們將為此應用程序使用流行的回聲協議。
首先,我們將構建一個回顯服務器,將發送給它的任何消息發回,然后是一個回顯客戶端,它只向服務器發送任意消息,最后,我們將測試應用程序以確保一切正常。
在 UDP 通信中,單個消息被封裝在DatagramPacket中,通過DatagramSocket發送。
讓我們從設置一個簡單的服務器開始:
public class EchoServer extends Thread {
private DatagramSocket socket;
private boolean running;
private byte[] buf = new byte[256];
public EchoServer() {
socket = new DatagramSocket(4445);
}
public void run() {
running = true;
while (running) {
DatagramPacket packet
= new DatagramPacket(buf, buf.length);
socket.receive(packet);
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
String received
= new String(packet.getData(), 0, packet.getLength());
if (received.equals("end")) {
running = false;
continue;
}
socket.send(packet);
}
socket.close();
}
}
我們創建了一個全局DatagramSocket,我們將在整個過程中使用它來發送數據包,一個字節數組來包裝我們的消息,以及一個名為running的狀態變量。
為簡單起見,服務器擴展了Thread,因此我們可以在run方法中實現所有內容。
在run內部,我們創建了一個 Java while 循環語句,該循環一直運行,直到running因某些錯誤或來自客戶端的終止消息而變為 false。
在循環的頂部,我們實例化一個DatagramPacket來接收傳入的消息。
接下來,我們在套接字上調用接收方法。此方法阻塞,直到消息到達并將消息存儲在傳遞給它的DatagramPacket的字節數組中。
收到消息后,我們檢索客戶端的地址和端口,因為我們要發
回響應。
接下來,我們創建一個DatagramPacket用于向客戶端發送消息。注意與接收數據包的簽名不同。這還需要我們向其發送消息的客戶端的地址和端口。
現在讓我們為這個新服務器推出一個簡單的客戶端:
public class EchoClient {
private DatagramSocket socket;
private InetAddress address;
private byte[] buf;
public EchoClient() {
socket = new DatagramSocket();
address = InetAddress.getByName("localhost");
}
public String sendEcho(String msg) {
buf = msg.getBytes();
DatagramPacket packet
= new DatagramPacket(buf, buf.length, address, 4445);
socket.send(packet);
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(
packet.getData(), 0, packet.getLength());
return received;
}
public void close() {
socket.close();
}
}
該代碼與服務器的代碼沒有什么不同。我們有我們的全局DatagramSocket和服務器地址。我們在構造函數中實例化這些。
我們有一個單獨的方法將消息發送到服務器并返回響應。
我們首先將字符串消息轉換為字節數組,然后創建一個DatagramPacket用于發送消息。
接下來——我們發送消息。我們立即將DatagramPacket轉換為接收數據包。
當回顯到達時,我們將字節轉換為字符串并返回該字符串。
在UDPTest.java類中,我們只需創建一個測試來檢查兩個應用程序的回顯能力:
public class UDPTest {
EchoClient client;
@Before
public void setup(){
new EchoServer().start();
client = new EchoClient();
}
@Test
public void whenCanSendAndReceivePacket_thenCorrect() {
String echo = client.sendEcho("hello server");
assertEquals("hello server", echo);
echo = client.sendEcho("server is working");
assertFalse(echo.equals("hello server"));
}
@After
public void tearDown() {
client.sendEcho("end");
client.close();
}
}
在setup中,我們啟動服務器并創建客戶端。在tearDown方法中,我們向服務器發送終止消息,以便它可以關閉,同時我們關閉客戶端。
在本文中,我們了解了用戶數據報協議并成功構建了我們自己的通過 UDP 通信的客戶端-服務器應用程序。如果大家想了解更多相關知識,可以關注一下動力節點的Java在線學習,里面的課程內容從入門到精通,細致全面,很適合沒有基礎的小伙伴學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習