我之前写过一个示例,一个简单的UDP服务端和客户端示例 http://cuisuqiang.iteye.com/blog/1543190,里面写过,如果你把自己当作客户端,那么客户端是可以指定自己的端口去发数的。
另外,后面有评论询问关于请求超时的问题,是2012-10-18问的,然后一年后的今天,我回复他了。
我回复的内容是ds.setSoTimeout(5000);即为收数超时时间,如果不设置,那就是等待,比电视剧里面爱情片都漫长的等待,而且结果是一样的,都是把自己等死了就不再等了。但是这个超时时间不能当作是你这个请求的超时时间,请注意这个概念,因为这个超时只是用于标记这段时间没有从网络中获取数据,但是即使获取数据了,那也不一定是你的,这个下面看示例就会明白。
然后就是端口问题,上面也说了你可以自己指定端口,也可以是把自己当作客户端,需要发送数据时就创建一个连接对象然后发送数据,这样端口就是动态的。意思就是说,只要DatagramSocket对象没有被重新初始化或消失,那么本地打开的这个UDP端口就不会关闭。
然后就是UDP状态的问题,其实早先就也有一篇文章了,UDP编程 UDP连接对象的理解和使用http://cuisuqiang.iteye.com/blog/1553989。无状态是说这个连接没有状态,鬼知道他到底有没有服务端,鬼也不知道就算那个服务端在他到底死了没有。但是对于本地来说,如果你的DatagramSocket对象一直存在,那么你的本地端口就是有状态的,他是活的。
然后做一个示例:
package test; import java.io.*; import java.net.*; import java.util.Arrays; /** * UDP客户端程序,用于对服务端发送数据,并接收服务端的回应信息 */ public class UdpClientSocket { private byte[] buffer = new byte[1024]; private static DatagramSocket ds = null; /** * 测试客户端发包和接收回应信息的方法 */ 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); } } /** * 构造函数,创建UDP客户端 */ public UdpClientSocket() throws Exception { ds = new DatagramSocket(8899); // 邦定本地端口作为客户端 ds.setSoTimeout(5000); } /** * 向指定的服务端发送数据信息 */ 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); } /** * 接收从指定的服务端发回的数据 */ 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发送数据,可以收到:
收到数据:[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没有状态,但是本地可以有
请您到ITEYE网站看原创,谢谢!
http://cuisuqiang.iteye.com/ !
自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!
相关推荐
如果没有收到任何ICMP消息,那么在超时后可以假设端口是开放的。 为了在Python中使用原始套接字,通常需要程序具有相应的系统权限,因此代码中也特别提到了需要运行程序的用户具有root权限。 整个检测过程涉及到多...
DUP服务端代码——UDPServer.py
相比TCP,UDP提供了更简单的服务,没有连接建立、数据确认和拥塞控制等机制,因此它的开销小,速度更快,但同时也可能导致数据丢失或乱序。 标题“UDP Pinger_3109udp_DUPpinger-JAVA_udppingwindows_udppingserver...
在本程序中,"DUP套接字客户端"利用UDP套接字实现了一个简单的发送数据的功能,这通常用于需要快速传输而不关心数据是否丢失或重复的场景,如在线视频流、实时游戏等。 首先,让我们深入理解UDP套接字的工作原理。...
1. 数据包捕获与分析:通过监听网络端口,捕获并解析TCP或UDP数据包,以了解通信内容和状态。 2. 数据模拟发送:可以模拟客户端或服务器,向指定IP和端口发送TCP或UDP数据包,测试网络连接和数据传输的正确性。 3. ...
结合UDP网络通信,一种可能的应用场景是:服务端使用UDP套接字监听特定端口,接收来自客户端的数据;客户端使用UDP套接字发送数据,并可以创建socket文件与本地其他进程通信,传递接收到的信息。这种方式允许网络...
3. **端口扫描**:TCPUDP调试工具可以执行端口扫描,检测目标设备上哪些端口是开放的,这对于网络安全评估和应用部署规划很有帮助。 4. **实时日志**:在调试过程中,实时的日志记录能帮助分析通信过程中的异常情况...
当调用`dup`时,它会找到一个未使用的描述符,并将其设置为与给定描述符(通常是已打开的文件)相同的状态。这样,通过新旧两个描述符进行的读写操作都会影响同一个文件或设备。 接下来,我们讨论`dup2`系统调用。`...
此测试工具用于开发网络通讯程序时,在服务器或客户端测试TCP/UDP通讯连接和测试数据的接收和发送情况。 【软件功能】 1.可收发TCP/UDP数据。 2.对于TCP,支持服务器和客户端模式。 3.支持多连接,可同时对多路网络...
5. 完成安装后,设备管理器中应显示DUP-414设备,并且状态应为“已启用”。 6. 测试驱动程序,可以使用`4月重点工作日程安排表.xls`这样的文件,通过打印预览和实际打印来验证中文显示和处理是否正常。 总的来说,...
端口号则存在于UDP和TCP报文的首部,用于标识特定的应用程序或服务。下面是部分协议号及其对应协议的列表: - **0**:HOPOPT,IPv6逐跳选项 - **1**:ICMP,Internet控制消息协议 - **2**:IGMP,Internet组管理...
dup函数在系统编写程序的用法 及源代码
DUP通信 亲测可用
1. **创建UdpClient对象**:在主机端,我们需要创建一个UdpClient实例,并指定发送数据的端口号。例如: ```csharp UdpClient udpSender = new UdpClient(); udpSender.Connect(new IPEndPoint(IPAddress.Broadcast,...
本篇文章将深入探讨如何通过`dup()`和`dup2()`两个系统调用来复制文件描述符,并提供相关示例代码。 `dup()`函数是Linux提供的一个系统调用,它的主要作用是创建一个新的文件描述符,该描述符与已存在的一个文件...
DUP 2.1 的内存补丁功能允许用户在不修改源代码的情况下,实时调整程序运行状态,这对于调试和优化有着显著的帮助。 文件补丁通常用于升级或修复软件的某些部分,它将变化的部分与原文件进行对比,生成只包含差异的...
《dup 补丁 2.2汉化版》是一款针对特定游戏——Diablo II(暗黑破坏神2)的修改工具,主要用于优化游戏体验和增强玩家的游戏功能。这个汉化版意味着它已经被翻译成中文,方便中国用户理解和使用,区别于某些只提供...
- UDP的多路复用特性:一个服务器端口可以接收来自多个客户端的数据报,通过数据报的源地址和端口区分不同客户端。 - 使用QHostAddress和quint16来存储每个客户端的信息,以便进行针对性的响应。 4. **QT GUI集成...
由于dUP带有"Ollydbg"的标签,可能意味着该工具在某些方面与OllyDbg有交互,例如可能支持使用Ollydbg进行更深入的分析或调试。 【压缩包子文件的文件名称列表】揭示了包含的组件: 1. `dup2_help.chm`:这是帮助...
基于udp 的多人聊天室,客户端可以随时发信息和接受