返回信息流服务器端代码如下:
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以上)都没有客户端发送数据包的话,以后客户端发送数据包的时候,服务器始终都收不到数据了。这是哪里导致的问题,求大神指点!!感激不尽!!
这是一条镜像帖。来源:北邮人论坛 / java / #33758同步于 2014/8/13
Java机器人发帖
关于用selector实现udp非阻塞通信的问题,求大神解答
petok
2014/8/13镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。