在Java语言中,可以通过以下代码来接收UDP报文
1、之前本人一直误以为:如果在socket.receive(p)这句代码执行之前,客户端给服务器发送了报文,那么服务器端是无法接收到该报文的,只有socket.receive(p)执行期间,客户端给服务器端发送报文,服务器端才能接收得到。
今天经过写代码验证,以上观点都是错误的。只要Socket绑定了地址,无论socket是否正在接收数据(即socket.receive(p)),服务器端都是能接收到客户端发送过来的报文的,此时报文应该已经存放在操作系统缓冲池(专业术语应该不是这么叫。。。)中。当socket执行接收方法(即socket.receive(p);),socket即可从缓冲池中取得该数据。至于缓冲池中的数据有没有失效时间,本人没有进行验证。
2、之前一直有个疑问:当代码处于上述代码中的while(true){...}代码块中时,如果此时将socket所绑定的网卡禁用,此时socket执行receive方法或者执行send方法时是否会抛异常?实践证明,不会。禁用网卡的事件对代码没有任何的影响。
String host="111.111.111.111";
int port=1111;
DatagramSocket socket=new DatagramSocket(null);
socket.bind(new InetSocketAddress(host,port));
while(true){
DatagramPacket incoming=new DatagramPacket(new byte[1024],1024);
socket.receive(p);
...
}
1、之前本人一直误以为:如果在socket.receive(p)这句代码执行之前,客户端给服务器发送了报文,那么服务器端是无法接收到该报文的,只有socket.receive(p)执行期间,客户端给服务器端发送报文,服务器端才能接收得到。
今天经过写代码验证,以上观点都是错误的。只要Socket绑定了地址,无论socket是否正在接收数据(即socket.receive(p)),服务器端都是能接收到客户端发送过来的报文的,此时报文应该已经存放在操作系统缓冲池(专业术语应该不是这么叫。。。)中。当socket执行接收方法(即socket.receive(p);),socket即可从缓冲池中取得该数据。至于缓冲池中的数据有没有失效时间,本人没有进行验证。
2、之前一直有个疑问:当代码处于上述代码中的while(true){...}代码块中时,如果此时将socket所绑定的网卡禁用,此时socket执行receive方法或者执行send方法时是否会抛异常?实践证明,不会。禁用网卡的事件对代码没有任何的影响。