/**
 * Socket事件处理线程
 */
Thread thread = new Thread() {
public void run() {
while (isRun) {
int count = selector.select();
if (count == 0) {
continue;
}
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> it = keys.iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
if (key.isAcceptable()) {
//.......
}
// 当对方关闭后,这里总是为true的,如果不把对应的Socket关掉,就会像死循环一样
if (key.isReadable()) { 
//........
}
}
keys.clear();
}
};
};跟着网上学的,代码大致如此,实际的代码会细致些....
我用.net写过类似的,两个.net之间是完好的, 但java跟.net,或java跟java, 无论先关掉哪个, 后关的那个就会死循环一样,狂收到空消息. 完整的示例代码可以从http://u.115.com/file/f43ee2c954下载
示例中149行出错后会把 SocketChannel 关掉,能在一定程度上避免死循环, 但如果另一个java不是关闭窗体,而是点按钮"全部关闭"的话,仍会死循环.