`
cuisuqiang
  • 浏览: 3963071 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3672405
社区版块
存档分类
最新评论

UDP DUP超时UPD端口UDP到底有没有状态

阅读更多

我之前写过一个示例,一个简单的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同步!

3
0
分享到:
评论
1 楼 baohuan_love 2013-12-18  
文章写的很不错

相关推荐

    python检测远程udp端口是否打开的方法

    如果没有收到任何ICMP消息,那么在超时后可以假设端口是开放的。 为了在Python中使用原始套接字,通常需要程序具有相应的系统权限,因此代码中也特别提到了需要运行程序的用户具有root权限。 整个检测过程涉及到多...

    DUP服务端代码——UDPServer.py

    DUP服务端代码——UDPServer.py

    欧姆龙 Fins/UDP客户端通讯

    7. **PLC状态检查**:在通讯前,可能需要检查PLC的状态,如在线/离线状态,以确保能成功通信。 通过这个C#源代码示例,开发者可以学习如何构建FINS/UDP客户端,实现与欧姆龙PLC的双向通信,进行数据采集、控制命令...

    UDP Pinger_3109udp_DUPpinger-JAVA_udppingwindows_udppingserver_源

    相比TCP,UDP提供了更简单的服务,没有连接建立、数据确认和拥塞控制等机制,因此它的开销小,速度更快,但同时也可能导致数据丢失或乱序。 标题“UDP Pinger_3109udp_DUPpinger-JAVA_udppingwindows_udppingserver...

    DUP套接字客户端

    在本程序中,"DUP套接字客户端"利用UDP套接字实现了一个简单的发送数据的功能,这通常用于需要快速传输而不关心数据是否丢失或重复的场景,如在线视频流、实时游戏等。 首先,让我们深入理解UDP套接字的工作原理。...

    串口&TCP_UDP调试工具

    1. 数据包捕获与分析:通过监听网络端口,捕获并解析TCP或UDP数据包,以了解通信内容和状态。 2. 数据模拟发送:可以模拟客户端或服务器,向指定IP和端口发送TCP或UDP数据包,测试网络连接和数据传输的正确性。 3. ...

    利用UDP协议与socket文件完成两个进程之间的网络通信

    结合UDP网络通信,一种可能的应用场景是:服务端使用UDP套接字监听特定端口,接收来自客户端的数据;客户端使用UDP套接字发送数据,并可以创建socket文件与本地其他进程通信,传递接收到的信息。这种方式允许网络...

    TCPUDP调试工具

    3. **端口扫描**:TCPUDP调试工具可以执行端口扫描,检测目标设备上哪些端口是开放的,这对于网络安全评估和应用部署规划很有帮助。 4. **实时日志**:在调试过程中,实时的日志记录能帮助分析通信过程中的异常情况...

    dup_dup2介绍

    当调用`dup`时,它会找到一个未使用的描述符,并将其设置为与给定描述符(通常是已打开的文件)相同的状态。这样,通过新旧两个描述符进行的读写操作都会影响同一个文件或设备。 接下来,我们讨论`dup2`系统调用。`...

    TCP/DUP数据测试工具

    此测试工具用于开发网络通讯程序时,在服务器或客户端测试TCP/UDP通讯连接和测试数据的接收和发送情况。 【软件功能】 1.可收发TCP/UDP数据。 2.对于TCP,支持服务器和客户端模式。 3.支持多连接,可同时对多路网络...

    DUP414中文驱动

    5. 完成安装后,设备管理器中应显示DUP-414设备,并且状态应为“已启用”。 6. 测试驱动程序,可以使用`4月重点工作日程安排表.xls`这样的文件,通过打印预览和实际打印来验证中文显示和处理是否正常。 总的来说,...

    常见协议端口号

    端口号则存在于UDP和TCP报文的首部,用于标识特定的应用程序或服务。下面是部分协议号及其对应协议的列表: - **0**:HOPOPT,IPv6逐跳选项 - **1**:ICMP,Internet控制消息协议 - **2**:IGMP,Internet组管理...

    dup源代码dup

    dup函数在系统编写程序的用法 及源代码

    简单的UDP通信

    DUP通信 亲测可用

    C#主机与客户机的udp通讯

    1. **创建UdpClient对象**:在主机端,我们需要创建一个UdpClient实例,并指定发送数据的端口号。例如: ```csharp UdpClient udpSender = new UdpClient(); udpSender.Connect(new IPEndPoint(IPAddress.Broadcast,...

    文件描述符的复制:dup()和dup2()示例代码

    本篇文章将深入探讨如何通过`dup()`和`dup2()`两个系统调用来复制文件描述符,并提供相关示例代码。 `dup()`函数是Linux提供的一个系统调用,它的主要作用是创建一个新的文件描述符,该描述符与已存在的一个文件...

    DUP 2.1 补丁编写工具

    DUP 2.1 的内存补丁功能允许用户在不修改源代码的情况下,实时调整程序运行状态,这对于调试和优化有着显著的帮助。 文件补丁通常用于升级或修复软件的某些部分,它将变化的部分与原文件进行对比,生成只包含差异的...

    dup 补丁 2.2汉化版

    《dup 补丁 2.2汉化版》是一款针对特定游戏——Diablo II(暗黑破坏神2)的修改工具,主要用于优化游戏体验和增强玩家的游戏功能。这个汉化版意味着它已经被翻译成中文,方便中国用户理解和使用,区别于某些只提供...

    C/C++ QT DUP 网络报文本地多用户通讯

    - UDP的多路复用特性:一个服务器端口可以接收来自多个客户端的数据报,通过数据报的源地址和端口区分不同客户端。 - 使用QHostAddress和quint16来存储每个客户端的信息,以便进行针对性的响应。 4. **QT GUI集成...

    dUP v2.17 Beta 23

    由于dUP带有"Ollydbg"的标签,可能意味着该工具在某些方面与OllyDbg有交互,例如可能支持使用Ollydbg进行更深入的分析或调试。 【压缩包子文件的文件名称列表】揭示了包含的组件: 1. `dup2_help.chm`:这是帮助...

Global site tag (gtag.js) - Google Analytics