TCP套接字是面向連接的,基于流。基于UDP的套接字是無連接的,基于數(shù)據(jù)報。
使用UDP發(fā)送的數(shù)據(jù)塊稱為數(shù)據(jù)報或UDP數(shù)據(jù)包。每個UDP分組具有數(shù)據(jù),目的地IP地址和目的地端口號。
無連接套接字在通信之前不建立連接。
UDP是不可靠的協(xié)議,因為它不保證到達分組的傳遞和順序。
在無連接協(xié)議UDP中,不會有服務器套接字。
在UDP連接中,客戶端和服務器發(fā)送或接收一組數(shù)據(jù),而無需事先知道它們之間的通信。
發(fā)送到同一目的地的每個數(shù)據(jù)塊獨立于先前發(fā)送的數(shù)據(jù)。
當編碼UDP連接時,使用以下兩個類。
DatagramPacket
類表示UDP數(shù)據(jù)報。DatagramSocket
類表示用于發(fā)送或接收數(shù)據(jù)報包的UDP套接字。以下代碼顯示如何在localhost中創(chuàng)建綁定到端口號12345的UDP套接字。
DatagramSocket udpSocket = new DatagramSocket(12345, "localhost");
DatagramSocket
類提供了一個bind()方法,它允許您將套接字綁定到本地IP地址和本地端口號。
DatagramPacket包含三個東西:
DatagramPacket類的構(gòu)造函數(shù)創(chuàng)建一個數(shù)據(jù)包來接收數(shù)據(jù)如下:
DatagramPacket(byte[] buf, int length) DatagramPacket(byte[] buf, int offset, int length)
DatagramPacket類的構(gòu)造函數(shù)創(chuàng)建一個數(shù)據(jù)包來發(fā)送數(shù)據(jù)如下:
DatagramPacket(byte[] buf, int length, InetAddress address, int port) DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) DatagramPacket(byte[] buf, int length, SocketAddress address) DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
以下代碼演示如何創(chuàng)建數(shù)據(jù)報:
以下代碼創(chuàng)建一個數(shù)據(jù)包以接收1024字節(jié)的數(shù)據(jù)。
byte[] data = new byte[1024]; DatagramPacket packet = new DatagramPacket(data, data.length);
以下代碼創(chuàng)建一個包的緩沖區(qū)大小為1024,并從偏移量8開始接收數(shù)據(jù),它將只接收32字節(jié)的數(shù)據(jù)。
byte[] data2 = new byte[1024]; DatagramPacket packet2 = new DatagramPacket(data2, 8, 32);數(shù)據(jù)包中的數(shù)據(jù)總是指定偏移量和長度。我們需要使用offset和length來讀取數(shù)據(jù)包中的數(shù)據(jù)。
更多建議: