BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #33758同步于 2014/8/13
Java机器人发帖

关于用selector实现udp非阻塞通信的问题,求大神解答

petok
2014/8/13镜像同步0 回复
服务器端代码如下: import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.charset.Charset; import java.util.Iterator; import java.util.Set; public class NioUdpServer { public static void main(String[] args) throws InterruptedException { try { while(true){ Selector selector = Selector.open(); DatagramChannel channel = DatagramChannel.open(); channel.configureBlocking(false); DatagramSocket socket = channel.socket(); socket.setReuseAddress(true); socket.bind(new InetSocketAddress(5558)); channel.register(selector, SelectionKey.OP_READ); ByteBuffer receiveBuffer = ByteBuffer.allocate(1024); System.out.println("hahaha"); while (selector.select(10000)>0) { Set<SelectionKey> readyKeys = selector.selectedKeys(); Iterator<SelectionKey> iter = readyKeys.iterator(); while (iter.hasNext()) { System.out.println(iter.hasNext()); SelectionKey key = iter.next(); iter.remove(); if (key.isReadable()) { DatagramChannel c = (DatagramChannel)key.channel(); c.receive(receiveBuffer); receiveBuffer.flip(); String str = Charset.forName("UTF-8").decode(receiveBuffer).toString(); System.out.println(str); } } } System.out.println("退出非阻塞"); Thread.sleep(2000); socket.close(); } }catch (IOException e) { e.printStackTrace(); } } } 问题:selector.select(10000)规定了轮询10秒,如果没有客户端发送数据包过来,就会进行另外一次新的轮询。如果我打开启动服务器,在10秒内立马用客户端发送数据,服务端可以收到数据包,但如果10秒内多次发送数据包,服务器就只能收到第一次发送的,其他的都收不到。而且如果我启动服务器之后,连续两次轮询以上(20s以上)都没有客户端发送数据包的话,以后客户端发送数据包的时候,服务器始终都收不到数据了。这是哪里导致的问题,求大神指点!!感激不尽!!
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。