java udp 同一个端口_java – 系统中的两个不同的UDP套接字可以绑定相同的端口吗?...
它與TCP和UDP之間的區(qū)別有關.當您創(chuàng)建TCP套接字時,您正在創(chuàng)建與另一臺計算機上的端口的同步客戶端連接,并且當您連接到地址時,您實際上也會在套接字上獲得本地端口.因此,在您的示例代碼中,創(chuàng)建的兩個套接字可能是
clientSocket = localhost:2649 ipAddress:8000
clientSocket1 = localhost:2650 ipAddress:8000
請注意,雖然它們的遠程地址相同,但本地地址具有不同的端口,這就是允許這樣做的原因.因此,本地遠程計算機可以使用已建立的端口可靠地來回發(fā)送數(shù)據(jù).
對于UDP,情況并非如此(我假設您正在使用DatagramSocket).由于UDP是異步的(與TCP之類的同步相反),為了接收數(shù)據(jù),您不會創(chuàng)建與另一臺特定機器的綁定,因此例如,如果您嘗試
DatagramSocket udp1 = new DatagramSocket(8000); // = localhost:8000 ?
DatagramSocket udp2 = new DatagramSocket(8000); // = localhost:8000 ?
udp套接字不知道數(shù)據(jù)來自何處,因此不能有像TCP這樣的唯一映射,與TCP不同,您指定的端口是您機器的端口,而不是遠程機器端口.
創(chuàng)建UDP套接字時想到它的另一種方法就像創(chuàng)建TCP服務器套接字一樣.當您創(chuàng)建TCP服務器套接字時,它正在等待來自某臺計算機的連接但該計算機未知,并且當您創(chuàng)建TCP服務器套接字時,您指定的端口是本地端口:
ServerSocket ss1 = new ServerSocket(8000); // = localhost:8000 ?
ServerSocket ss2 = new ServerSocket(8000); // = localhost:8000 ?
與UDP類似,這將創(chuàng)建綁定異常,因為該端口用于本地計算機,并且映射不再是唯一的.但是,當您接受服務器套接字上的連接時,遠程計算機會發(fā)揮作用以使套接字唯一,就像創(chuàng)建Socket到遠程計算機時一樣:
Socket s1 = ss1.accept();// localhost:8000 remoteIp1:12345
Socket s2 = ss1.accept();// localhost:8000 remoteIp2:54321
請注意,雖然本地地址相同,但套接字的遠程地址不同,因此總映射(localip:port< - > remoteip:port)現(xiàn)在是唯一的.
因此,在某種程度上,您可以將UDP套接字視為類似于TCP服務器套接字,這就是為什么必須將其綁定到唯一端口的原因.
總結(jié)
以上是生活随笔為你收集整理的java udp 同一个端口_java – 系统中的两个不同的UDP套接字可以绑定相同的端口吗?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7本地连接不了怎么回事 win7无
- 下一篇: 线程安全面试题 java_Java面试题