UDP协议怎么确定接收消息长短?
理论上,IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。 去除20字节的IP首部和8个字节的UDP首部, UDP数据报中用户数据的最长长度为65507字节。所以可以预先开辟一块64k的常驻内存空间,recvfrom每次用该buffer去接收数据,它的返回值就是接收消息的长度。 请采纳,谢谢。
java 怎么用UDP实时接收数据?
我自己写的代码:import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class UdpRecvDemo{ public static void main(String[] args) throws IOException { Recv(); } public static void Recv() throws IOException { System.out.println("接受开始......"); DatagramSocket ds = new DatagramSocket(3388); while(true) { byte[]buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp); System.out.println(ds); String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String text = new String(dp.getData(),0,dp.getLength()); if(text.equals("exit")) { System.out.println(ip+"退出会话......"); break; } System.out.println(ip+":"+port+"===>me "+text); } ds.close(); }}
如何 监听,接收 所有UDP端口 数据
12端口就用12个线程去接收。但处理都是一样的吧。 所以要有个事件比如定义一个事件public delegate void DataArrivalHandler(byte[] data);参数你定,或者(Streams)之类,也可以是自定一个类(包含其它信息)继承EventArgs写个 (DataEventArgs e)public event DataArrivalHandler OnDataArrived;OnDataArrived+=()这里注册相应的方法,如果不同端口的处理不一样,就相应写不同的事件,当然也可以只定义一个方法,方法根据不同的端口处理。while(true){byte[] data = (获取)这里获取数据后,直接调用OnDataArrived(data)/OnDataArrived(stream)/OnDataArrived(new DataEventArgs (data,ip,port)之类,根据你定义的参数来。}而注册的方法里的具体实现,用委托异步调用.方法体里执行{namedDelegate.beginEnvoke();}这样,数据处理就异步完成了。避免数据丢失的话,做个保险。把接收的数据放入定义的缓冲块里。当接收的数据量到达一定程序后,取出部分处理,再加入新数据。类似于TCP的的滑动窗口。麻烦点,但实现了,效果会好的多。--------------------------为什么要用ThreadPool?不便于控制状态。当你的线程处理的业务非常单一时用它,这种情况需要不需额外的状态信息,比如就像你上面的每次有不同的byte[] data。 直接 new ThreadStart();
udp服务器怎么确定已经收到数据了呢,大佬帮忙解答下?
服务器有没有收到数据,抓个包看看就行了。 recvfrom和sendto都是阻塞的。通常来说,由于网络连接具有缓冲区,sendto函数直接将数据复制至缓冲区后即可认为操作完成,因此很少阻塞(除非缓冲区已满,它才会等待缓冲区足够写入后才能操作);而recvfrom是从缓冲区读数据,如果没有数据则会一直阻塞。 解决阻塞的方法一般有两种:使用setsockopt函数设置超时时长;在主线程中关闭socket,阻塞函数会报错并退出。
java 怎么用UDP实时接收数据?
我自己写的代码:import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class UdpRecvDemo{ public static void main(String[] args) throws IOException { Recv(); } public static void Recv() throws IOException { System.out.println("接受开始......"); DatagramSocket ds = new DatagramSocket(3388); while(true) { byte[]buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp); System.out.println(ds); String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String text = new String(dp.getData(),0,dp.getLength()); if(text.equals("exit")) { System.out.println(ip+"退出会话......"); break; } System.out.println(ip+":"+port+"===>me "+text); } ds.close(); }}
本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/312628.html。