我之前写过一个示例,一个简单的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同步!
相关推荐
DUP服务端代码——UDPServer.py
此测试工具用于开发网络通讯程序时,在服务器或客户端测试TCP/UDP通讯连接和测试数据的接收和发送情况。 【软件功能】 1.可收发TCP/UDP数据。 2.对于TCP,支持服务器和客户端模式。 3.支持多连接,可同时对多路网络...
在linux中实现dup以及dup2,用C语言实现,里面有可执行文件,直接运行
dup函数在系统编写程序的用法 及源代码
DUP通信 亲测可用
DUP-414中文驱动,希望能有需要的同学
基于udp 的多人聊天室,客户端可以随时发信息和接受
vb.net dup通信,含打洞技术,很有用,提供给大家学习。
Linux系统编程——文件描述符的复制:dup()和dup2(),相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45870459
TCPUDP调试小工具可用于测试两台网络通信设备间的网络通断,以及数据传输,特别对于网络通信开发,开用于实验测试!
dUP v2.17 Beta 23 汉化版 by tracky
本程基于VC2010编写,用UDP套接字实现了简单的发送功能。
UNIX编程中的dup和dup2说明 UNIX编程中的dup和dup2说明
2.2最新版的哦。汉化过的,非汉化站的东西
在对于调试socket连接时针对报文发送和接收监控,可以用ascii码或16进制字符串进行操作。
经典的补丁工具,破解领域很有名的哦!!!!
详细介绍dup2函数用法,一看必懂.。。。
matlab code for mosaicing of two images.here we use homography and ransac for mosaicng of two images.
主程序:dup2.exedup2即diablo2oo2's Universal Patcher,本版本为简体中汉化版,它是一款非常好用的补丁制作工具,功能强大,编辑后可以即时生成补丁或生成Loader,你可以根据需要来自定义设置皮肤,生成的补丁...
我经常用的东西很好用 支持偏移量补丁 内存补丁 文件补丁