标签:17 09 curChannel 2021 key SelectionKey SocketChannel channel 客户端
遍历Selector SelectionKey的Set集合时,如果都强转为SocketChannel时会抛类型转换异常
今天在学习Java NIO多人聊天室项目时,在将消息广播到其它客户端时,为了方便把Set集合中遍历到的项直接都强转为SocketChannel,服务器启动后客户端只发送了一条消息,客户端就停止了。代码如下:
// 消息广播到其它客户端
private void castOtherClient(Selector selector, SelectionKey selectionKey, String message) throws IOException, ClassCastException {
SocketChannel channel = (SocketChannel)selectionKey.channel();
Set<SelectionKey> channels = selector.keys();
for (SelectionKey key : channels) {
SocketChannel socketChannel = (SocketChannel) key.channel();
if(socketChannel instanceof SocketChannel && socketChannel != channel) {
socketChannel.write(Charset.forName("UTF-8").encode(message));
}
}
}
}
发现问题后,修改如下:
// 消息广播到其它客户端
private void castOtherClient(Selector selector, SelectionKey selectionKey, String message) throws IOException, ClassCastException {
SocketChannel channel = (SocketChannel)selectionKey.channel();
Set<SelectionKey> channels = selector.keys();
for (SelectionKey key : channels) {
Channel curChannel = key.channel();
if(curChannel instanceof SocketChannel && curChannel != channel) {
((SocketChannel)curChannel).write(Charset.forName("UTF-8").encode(message));
}
}
}
由于在Selector中注册的通道有很多 FileChannel, SocketChannel, ServerSocketChannel, DatagramChannel 类型是不能强转为其中某一个,要先判断是哪个勒的实例 instanceof
标签:17,09,curChannel,2021,key,SelectionKey,SocketChannel,channel,客户端 来源: https://blog.csdn.net/weixin_45760485/article/details/120351300
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。