本文主要介绍UDPDUP超时UPD端口状态检测,通过示例代码进行了非常详细的介绍,对大家的学习或者工作有一定的参考价值,有需要的朋友可以参考一下。
我之前写过一个例子,一个简单的UDP服务器和客户端的例子。里面已经写了,如果你把自己当成客户端,那么客户端可以指定自己的端口发送号码。
ds.setsotimeout(5000);即收集超时。如果你不设置它,它就在等待。比电视剧里的爱情故事还要漫长的等待,结果是一样的。他们都在等待死亡。但是,这个超时不能算是你请求的超时。请注意这个概念,因为这个超时只是用来标记这段时间没有从网络上获取数据,但即使获取了数据,也不一定是你的。看下面的例子就明白了。
然后就是端口问题。它还说您可以自己指定端口,也可以将自己作为客户端使用。当需要发送数据时,可以创建一个连接对象,然后发送数据,这样端口就是动态的。也就是说,只要DatagramSocket对象没有重新初始化或消失,本地打开的UDP端口就不会关闭。
然后就是UDP状态的问题。其实之前有一篇文章是关于UDP连接对象的理解和使用的。无状态意味着这个连接没有状态,谁知道他有没有服务器,那个服务器死了没有。但是对于local来说,如果你的DatagramSocket对象一直存在,那么你的本地端口就是有状态的,是活的。
然后打个比方:
packagetest; importjava.io.*; importjava.net.*; importjava.util.Arrays; /** *UDP客户端程序,用于对服务端发送数据,并接收服务端的回应信息 */ publicclassUdpClientSocket{ privatebyte[]buffer=newbyte[1024]; privatestaticDatagramSocketds=null; /** *测试客户端发包和接收回应信息的方法 */ publicstaticvoidmain(String[]args)throwsException{ UdpClientSocketclient=newUdpClientSocket(); StringserverHost="127.0.0.1"; intserverPort=10002; client.send(serverHost,serverPort,newbyte[]{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); } } /** *构造函数,创建UDP客户端 */ publicUdpClientSocket()throwsException{ ds=newDatagramSocket(8899);//邦定本地端口作为客户端 ds.setSoTimeout(5000); } /** *向指定的服务端发送数据信息 */ publicfinalvoidsend(finalStringhost,finalintport,finalbyte[]bytes)throwsIOException{ DatagramPacketdp=newDatagramPacket(bytes,bytes.length,InetAddress.getByName(host),port); ds.send(dp); } /** *接收从指定的服务端发回的数据 */ publicfinalbyte[]receive()throwsException{ try{ DatagramPacketdp=newDatagramPacket(buffer,buffer.length); ds.receive(dp); byte[]data=newbyte[dp.getLength()]; System.arraycopy(dp.getData(),0,data,0,dp.getLength()); returndata; }catch(Exceptione){ e.printStackTrace(); returnnull; } } }运行时不断报告错误:
Java.net.sockettimeoutexception:在Java.net.plaindatagramsocketimpl.Receive0(本机方法)
atJava.net.plaindatagramsocketimpl.Receive(plaindatagramsocketimpl.Java:136)
atJava.net.datagramsocket.Receive(datagramsocket.Java:712)
attest.测试时的udpclientsocket.receive(udpclientsocket.Java:46)
。udpclientsocket.main(udpclientsocket.Java:20)
java.net.sockettimeoutexception:在Java.net.plaindatagramsocketimpl.Receive0(本机方法)
在Java.net.plaindatagramsocketimpl.Receive(plaindatagramsocketimpl.Java:136)
在Java.net测试时的udpclientsocket.receive(udpclientsocket.Java:46)
。udpclientsocket.main(udpclientsocket.Java:20)
使用TCPUDPDbg向8899发送数据,可以接收到:
收到的数据:[16,17,18,19,20]
在这里的例子中已经说明了这一点
1.本地端口是8899
2.数据收集超时为5秒
3.一组数据被发送到本地端口10002。谁知道有没有收到
4.连续获取本地端口8899接收的UDP数据。
然后找到
1.发送数据时没有错误
2.总是报告错误的收集超时
3.可以接收TCPUDPDbg发送给8899的数据。
摘要:
1.UDP可以指定数据收集的超时,但是每个请求的超时需要自己控制
2.UDP可以绑定本地端口的数量,并且这个端口可以在一种状态下存活
3.UDP没有状态,但可以是本地的。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)