UDP DUP超時(shí)UPD端口狀態(tài)檢測(cè)代碼示例
我之前寫(xiě)過(guò)一個(gè)示例,簡(jiǎn)單UDP服務(wù)端和客戶端示例 ,里面寫(xiě)過(guò),如果你把自己當(dāng)作客戶端,那么客戶端是可以指定自己的端口去發(fā)數(shù)的。
ds.setSoTimeout(5000);即為收數(shù)超時(shí)時(shí)間,如果不設(shè)置,那就是等待,比電視劇里面愛(ài)情片都漫長(zhǎng)的等待,而且結(jié)果是一樣的,都是把自己等死了就不再等了。但是這個(gè)超時(shí)時(shí)間不能當(dāng)作是你這個(gè)請(qǐng)求的超時(shí)時(shí)間,請(qǐng)注意這個(gè)概念,因?yàn)檫@個(gè)超時(shí)只是用于標(biāo)記這段時(shí)間沒(méi)有從網(wǎng)絡(luò)中獲取數(shù)據(jù),但是即使獲取數(shù)據(jù)了,那也不一定是你的,這個(gè)下面看示例就會(huì)明白。
然后就是端口問(wèn)題,上面也說(shuō)了你可以自己指定端口,也可以是把自己當(dāng)作客戶端,需要發(fā)送數(shù)據(jù)時(shí)就創(chuàng)建一個(gè)連接對(duì)象然后發(fā)送數(shù)據(jù),這樣端口就是動(dòng)態(tài)的。意思就是說(shuō),只要DatagramSocket對(duì)象沒(méi)有被重新初始化或消失,那么本地打開(kāi)的這個(gè)UDP端口就不會(huì)關(guān)閉。
然后就是UDP狀態(tài)的問(wèn)題,其實(shí)早先就也有一篇文章了, UDP連接對(duì)象的理解和使用。無(wú)狀態(tài)是說(shuō)這個(gè)連接沒(méi)有狀態(tài),鬼知道他到底有沒(méi)有服務(wù)端,鬼也不知道就算那個(gè)服務(wù)端在他到底死了沒(méi)有。但是對(duì)于本地來(lái)說(shuō),如果你的DatagramSocket對(duì)象一直存在,那么你的本地端口就是有狀態(tài)的,他是活的。
然后做一個(gè)示例:
package test; import java.io.*; import java.net.*; import java.util.Arrays; /** * UDP客戶端程序,用于對(duì)服務(wù)端發(fā)送數(shù)據(jù),并接收服務(wù)端的回應(yīng)信息 */ public class UdpClientSocket { private byte[] buffer = new byte[1024]; private static DatagramSocket ds = null; /** * 測(cè)試客戶端發(fā)包和接收回應(yīng)信息的方法 */ public static void main(String[] args) throws Exception { UdpClientSocket client = new UdpClientSocket(); String serverHost = "127.0.0.1"; int serverPort = 10002; client.send(serverHost, serverPort, new byte[]{1,2,3,4,5}); while(true){ byte[] bt = client.receive(); if(null != bt && bt.length > 0) System.out.println("收到數(shù)據(jù):" + Arrays.toString(bt)); Thread.sleep(1000); } } /** * 構(gòu)造函數(shù),創(chuàng)建UDP客戶端 */ public UdpClientSocket() throws Exception { ds = new DatagramSocket(8899); // 邦定本地端口作為客戶端 ds.setSoTimeout(5000); } /** * 向指定的服務(wù)端發(fā)送數(shù)據(jù)信息 */ public final void send(final String host, final int port,final byte[] bytes) throws IOException { DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName(host), port); ds.send(dp); } /** * 接收從指定的服務(wù)端發(fā)回的數(shù)據(jù) */ public final byte[] receive() throws Exception { try { DatagramPacket dp = new DatagramPacket(buffer, buffer.length); ds.receive(dp); byte[] data = new byte[dp.getLength()]; System.arraycopy(dp.getData(), 0, data, 0, dp.getLength()); return data; } catch (Exception e) { e.printStackTrace(); return null; } } }
運(yùn)行一直報(bào)錯(cuò):
java.net.SocketTimeoutException: Receive timed out
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
at java.net.DatagramSocket.receive(DatagramSocket.java:712)
at test.UdpClientSocket.receive(UdpClientSocket.java:46)
at test.UdpClientSocket.main(UdpClientSocket.java:20)
java.net.SocketTimeoutException: Receive timed out
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
at java.net.DatagramSocket.receive(DatagramSocket.java:712)
at test.UdpClientSocket.receive(UdpClientSocket.java:46)
at test.UdpClientSocket.main(UdpClientSocket.java:20)
使用TCPUDPDbg向8899發(fā)送數(shù)據(jù),可以收到:
收到數(shù)據(jù):[16, 17, 18, 19, 20]
這里示例中已經(jīng)寫(xiě)明
1.本地端口是8899
2.收數(shù)超時(shí)時(shí)間是5秒
3.向本地10002端口發(fā)送了一組數(shù)據(jù),鬼知道有沒(méi)有收到
4.不斷獲取本地端口8899收到的UDP數(shù)據(jù)
然后發(fā)現(xiàn)
1.發(fā)送數(shù)據(jù)沒(méi)有報(bào)錯(cuò)
2.一直報(bào)錯(cuò)收數(shù)超時(shí)
3.使用TCPUDPDbg向8899發(fā)送數(shù)據(jù)能夠收到
總結(jié):
1.UDP能指定收數(shù)超時(shí),但是每個(gè)請(qǐng)求的超時(shí)需要自己控制
2.UDP可以邦定本地端口發(fā)數(shù),而且這個(gè)端口可以有狀態(tài)存活
3.UDP沒(méi)有狀態(tài),但是本地可以有
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點(diǎn)實(shí)例分析
- Java concurrency之AtomicLongFieldUpdater原子類(lèi)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- MySQL的Replace into 與Insert into on duplicate key update真正的不同之處
- mysql ON DUPLICATE KEY UPDATE語(yǔ)句示例
- insert into … on duplicate key update / replace into 多行數(shù)據(jù)介紹
- 深入mysql "ON DUPLICATE KEY UPDATE" 語(yǔ)法的分析
- mysql insert的幾點(diǎn)操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )
相關(guān)文章
服務(wù)器常見(jiàn)問(wèn)題匯總(常見(jiàn)故障及相應(yīng)的解決方法)
服務(wù)器一般是很少出現(xiàn)問(wèn)題的,一旦出現(xiàn)問(wèn)題,怎樣去積極的搶救呢?我們不能坐以待斃,原因一旦服務(wù)器故障,那么該服務(wù)器上的所有網(wǎng)站將都會(huì)無(wú)法打開(kāi)。對(duì)于一個(gè)企業(yè)來(lái)說(shuō),網(wǎng)站就是他們的命脈,損失是巨大的2017-04-04ssh更改默認(rèn)端口號(hào)及實(shí)現(xiàn)免密碼遠(yuǎn)程登錄
這篇文章主要介紹了ssh更改默認(rèn)端口號(hào)及實(shí)現(xiàn)免密碼遠(yuǎn)程登錄的相關(guān)資料,需要的朋友可以參考下2017-10-10關(guān)于HTTPS端口443的技術(shù)講解(什么是443端口)
本文將重點(diǎn)介紹HTTPS 443端口,它是如何工作的,它保護(hù)什么,以及為什么我們需要它,需要的朋友可以參考下2022-10-10Hadoop中namenode和secondarynamenode工作機(jī)制講解
今天小編就為大家分享一篇關(guān)于Hadoop中namenode和secondarynamenode工作機(jī)制講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01親自教你在netty中使用TCP協(xié)議請(qǐng)求DNS服務(wù)器的詳細(xì)過(guò)程
DNS的全稱domain name system,既然是一個(gè)系統(tǒng)就有客戶端和服務(wù)器之分,這篇文章主要介紹了在netty中使用TCP協(xié)議請(qǐng)求DNS服務(wù)器的全過(guò)程,需要的朋友可以參考下2022-07-07Kloxo面板無(wú)法登錄出現(xiàn)500錯(cuò)誤的解決方法
這篇文章主要介紹了Kloxo面板無(wú)法登錄出現(xiàn)500錯(cuò)誤的解決方法,需要的朋友可以參考下2015-10-10使用acme.sh注冊(cè)免費(fèi)的ssl證書(shū)
這篇文章主要介紹了acme.sh注冊(cè)免費(fèi)的ssl證書(shū),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03