我在用JAVA nio开发服务器的时候,遇到个奇怪的问题!那位大侠帮帮我!while (true) {
int nKeys = selector.select();
// System.out.println("nKeys = " + nKeys);
if (nKeys < 1) {
continue;
}
Set selectedKeys = selector.selectedKeys();
Iterator it = selectedKeys.iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
it.remove();
if (key.isAcceptable()) {
// System.out.println("新的连接进入");
// 新人来报道(先找到报道的对象)
ServerSocketChannel serverChanel = (ServerSocketChannel) key.channel();
SocketChannel sc = serverChanel.accept();
sc.configureBlocking(false);
// 把新连接注册到选择器,新用户被接收后给注册号
SelectionKey newKey = sc.register(selector,SelectionKey.OP_READ); // 注册成功,并分配权限
event.onLinkEvent(sc);
// System.out.println("newKey = " + newKey);
} else if (key.isReadable()) {
// System.out.println("新的消息进入");
SocketChannel sc = (SocketChannel) key.channel(); // 通过注册号知道是谁
ByteBuffer echoBuffer = ByteBuffer.allocate(1024);
try {
sc.read(echoBuffer);
echoBuffer.flip();
} catch (IOException e) {
try {
System.out.println("连接关闭");
event.onCloseEvent(key, true);
sc.close();
key.cancel();
} catch (IOException e1) {
//e1.printStackTrace();
event.onCloseEvent(key, true);
}
break;
// e.printStackTrace();
}
byte[] data = new byte[echoBuffer.limit()];
echoBuffer.get(data);
System.out.println("server data = "+data.length);
if(data.length != 0)
executorService.execute(new Handler(key,data));
else{
System.out.println("错误错误");
}
//sc.register(selector, SelectionKey.OP_WRITE);
// selector.wakeup();
} else if (key.isWritable()) {
// System.out.println("调用了写");
SocketChannel sc = (SocketChannel) key.channel();
byte[] data = { 1, 2, 3, 4 };
ByteBuffer echoBuffer = ByteBuffer.wrap(data);
echoBuffer.flip();
try {
sc.write(echoBuffer);
} catch (IOException e) {
sc.close();
return;
}
sc.register(selector, SelectionKey.OP_READ);
} }
selectedKeys.clear();
} }
不知道什么原因,在这里会忽然死掉,不停的去while(true)循环去了!

解决方案 »

  1.   

    晕哟。
    if (nKeys < 1) { 
    continue; 
    }
    说明你的nKeys < 1始终为true。就会死循环。
      

  2.   


    while (true) {
    int nKeys = selector.select();
    // System.out.println("nKeys = " + nKeys);
    if (nKeys < 1) {
    continue;
    } 这个肯定会一直循环吧,即使nkeys>1
    他也不会跳出循环的
    如果想在nkeys>1的时候跳出循环 应该用break 吧
      

  3.   

    用selector.select(long)试试