Java NIO 异常
Java NIO Exception
嗨,我正在尝试使用 NIO 进行聊天,在服务器部分与主线程分开时,我:
private void broadcast(String msg, String user)
{
String Message = user + ":" + msg + "[=11=]";
System.out.println(Message);
ByteBuffer buf=ByteBuffer.wrap(Message.getBytes());
Set<SelectionKey> selectedKeys = selector.keys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext())
{
SelectionKey key = keyIterator.next();
if(key.attachment() != user)
{
try {
((SocketChannel) key.channel()).write(buf);
} catch (IOException e) {
e.printStackTrace();
}
buf.rewind();
}
keyIterator.remove();
}
}
我得到这个异常:
java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.remove(Unknown Source)
at chatserver.MessageSender.broadcast(MessageSender.java:41)
at chatserver.MessageSender.run(MessageSender.java:113)
at java.lang.Thread.run(Unknown Source)
第 41 行是:keyIterator.remove();
我以此为指导:Java NIO Tutorial
您正在调用 Selector.keys()
您似乎想要 Selector.selectedKeys()
的地方。前者返回的 Set
被记录为完全不可修改,而后者返回的 - 与您分配结果的变量的名称更好地一致 - 被记录为允许删除元素。此外,所选键是为 I/O.
准备的键
嗨,我正在尝试使用 NIO 进行聊天,在服务器部分与主线程分开时,我:
private void broadcast(String msg, String user)
{
String Message = user + ":" + msg + "[=11=]";
System.out.println(Message);
ByteBuffer buf=ByteBuffer.wrap(Message.getBytes());
Set<SelectionKey> selectedKeys = selector.keys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext())
{
SelectionKey key = keyIterator.next();
if(key.attachment() != user)
{
try {
((SocketChannel) key.channel()).write(buf);
} catch (IOException e) {
e.printStackTrace();
}
buf.rewind();
}
keyIterator.remove();
}
}
我得到这个异常:
java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.remove(Unknown Source)
at chatserver.MessageSender.broadcast(MessageSender.java:41)
at chatserver.MessageSender.run(MessageSender.java:113)
at java.lang.Thread.run(Unknown Source)
第 41 行是:keyIterator.remove(); 我以此为指导:Java NIO Tutorial
您正在调用 Selector.keys()
您似乎想要 Selector.selectedKeys()
的地方。前者返回的 Set
被记录为完全不可修改,而后者返回的 - 与您分配结果的变量的名称更好地一致 - 被记录为允许删除元素。此外,所选键是为 I/O.