TCP套接字是面向連接的,基于流?;赨DP的套接字是無(wú)連接的,基于數(shù)據(jù)報(bào)。
使用UDP發(fā)送的數(shù)據(jù)塊稱為數(shù)據(jù)報(bào)或UDP數(shù)據(jù)包。每個(gè)UDP分組具有數(shù)據(jù),目的地IP地址和目的地端口號(hào)。
無(wú)連接套接字在通信之前不建立連接。
UDP是不可靠的協(xié)議,因?yàn)樗槐WC到達(dá)分組的傳遞和順序。
在無(wú)連接協(xié)議UDP中,不會(huì)有服務(wù)器套接字。
在UDP連接中,客戶端和服務(wù)器發(fā)送或接收一組數(shù)據(jù),而無(wú)需事先知道它們之間的通信。
發(fā)送到同一目的地的每個(gè)數(shù)據(jù)塊獨(dú)立于先前發(fā)送的數(shù)據(jù)。
當(dāng)編碼UDP連接時(shí),使用以下兩個(gè)類。
DatagramPacket
類表示UDP數(shù)據(jù)報(bào)。DatagramSocket
類表示用于發(fā)送或接收數(shù)據(jù)報(bào)包的UDP套接字。以下代碼顯示如何在localhost中創(chuàng)建綁定到端口號(hào)12345的UDP套接字。
DatagramSocket udpSocket = new DatagramSocket(12345, "localhost");
DatagramSocket
類提供了一個(gè)bind()方法,它允許您將套接字綁定到本地IP地址和本地端口號(hào)。
DatagramPacket包含三個(gè)東西:
DatagramPacket類的構(gòu)造函數(shù)創(chuàng)建一個(gè)數(shù)據(jù)包來(lái)接收數(shù)據(jù)如下:
DatagramPacket(byte[] buf, int length) DatagramPacket(byte[] buf, int offset, int length)
DatagramPacket類的構(gòu)造函數(shù)創(chuàng)建一個(gè)數(shù)據(jù)包來(lái)發(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ù)報(bào):
以下代碼創(chuàng)建一個(gè)數(shù)據(jù)包以接收1024字節(jié)的數(shù)據(jù)。
byte[] data = new byte[1024]; DatagramPacket packet = new DatagramPacket(data, data.length);
以下代碼創(chuàng)建一個(gè)包的緩沖區(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ù)總是指定偏移量和長(zhǎng)度。我們需要使用offset和length來(lái)讀取數(shù)據(jù)包中的數(shù)據(jù)。
更多建議: