UDP DUP超時UPD端口狀態(tài)檢測代碼示例
我之前寫過一個示例,簡單UDP服務端和客戶端示例 ,里面寫過,如果你把自己當作客戶端,那么客戶端是可以指定自己的端口去發(fā)數的。
ds.setSoTimeout(5000);即為收數超時時間,如果不設置,那就是等待,比電視劇里面愛情片都漫長的等待,而且結果是一樣的,都是把自己等死了就不再等了。但是這個超時時間不能當作是你這個請求的超時時間,請注意這個概念,因為這個超時只是用于標記這段時間沒有從網絡中獲取數據,但是即使獲取數據了,那也不一定是你的,這個下面看示例就會明白。
然后就是端口問題,上面也說了你可以自己指定端口,也可以是把自己當作客戶端,需要發(fā)送數據時就創(chuàng)建一個連接對象然后發(fā)送數據,這樣端口就是動態(tài)的。意思就是說,只要DatagramSocket對象沒有被重新初始化或消失,那么本地打開的這個UDP端口就不會關閉。
然后就是UDP狀態(tài)的問題,其實早先就也有一篇文章了, UDP連接對象的理解和使用。無狀態(tài)是說這個連接沒有狀態(tài),鬼知道他到底有沒有服務端,鬼也不知道就算那個服務端在他到底死了沒有。但是對于本地來說,如果你的DatagramSocket對象一直存在,那么你的本地端口就是有狀態(tài)的,他是活的。
然后做一個示例:
package test; import java.io.*; import java.net.*; import java.util.Arrays; /** * UDP客戶端程序,用于對服務端發(fā)送數據,并接收服務端的回應信息 */ public class UdpClientSocket { private byte[] buffer = new byte[1024]; private static DatagramSocket ds = null; /** * 測試客戶端發(fā)包和接收回應信息的方法 */ 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("收到數據:" + Arrays.toString(bt)); Thread.sleep(1000); } } /** * 構造函數,創(chuàng)建UDP客戶端 */ public UdpClientSocket() throws Exception { ds = new DatagramSocket(8899); // 邦定本地端口作為客戶端 ds.setSoTimeout(5000); } /** * 向指定的服務端發(fā)送數據信息 */ 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); } /** * 接收從指定的服務端發(fā)回的數據 */ 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; } } }
運行一直報錯:
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ā)送數據,可以收到:
收到數據:[16, 17, 18, 19, 20]
這里示例中已經寫明
1.本地端口是8899
2.收數超時時間是5秒
3.向本地10002端口發(fā)送了一組數據,鬼知道有沒有收到
4.不斷獲取本地端口8899收到的UDP數據
然后發(fā)現
1.發(fā)送數據沒有報錯
2.一直報錯收數超時
3.使用TCPUDPDbg向8899發(fā)送數據能夠收到
總結:
1.UDP能指定收數超時,但是每個請求的超時需要自己控制
2.UDP可以邦定本地端口發(fā)數,而且這個端口可以有狀態(tài)存活
3.UDP沒有狀態(tài),但是本地可以有
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點實例分析
- Java concurrency之AtomicLongFieldUpdater原子類_動力節(jié)點Java學院整理
- MySQL的Replace into 與Insert into on duplicate key update真正的不同之處
- mysql ON DUPLICATE KEY UPDATE語句示例
- insert into … on duplicate key update / replace into 多行數據介紹
- 深入mysql "ON DUPLICATE KEY UPDATE" 語法的分析
- mysql insert的幾點操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )
相關文章
Hadoop中namenode和secondarynamenode工作機制講解
今天小編就為大家分享一篇關于Hadoop中namenode和secondarynamenode工作機制講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01親自教你在netty中使用TCP協(xié)議請求DNS服務器的詳細過程
DNS的全稱domain name system,既然是一個系統(tǒng)就有客戶端和服務器之分,這篇文章主要介紹了在netty中使用TCP協(xié)議請求DNS服務器的全過程,需要的朋友可以參考下2022-07-07