java nio 聊天室_Java NIO(六):实现多人聊天室

本文详细介绍了如何使用 Java NIO 实现一个多人聊天室。服务端通过 ServerSocketChannel、Selector 和 ByteBuffer 来处理客户端连接和数据收发,客户端通过 SocketChannel、Selector 连接服务端并接收发送消息。整个过程包括非阻塞模式设置、通道事件监听、字符集编解码以及消息转发机制。
摘要由CSDN通过智能技术生成

服务端思路:

定义一个 Charset 字符集用于解析数据

定义两个 ByteBuffered 缓冲区用于收发数据

定义一个 Map 用于存放客户端集合

定义一个 Selector 用于监听通道事件

通过 ServerSocketChannel 的 open 方法打开一个 ServerSocketChannel 通道

设置为非阻塞模式,并传递一个 InetSocketAddress 绑定端口

注册 ServerSocketChannel 的接收就绪事件通道到 Selector

循环监听事件

调用 Selector 的 select 方法阻塞直到有准备就绪的通道

调用 Selector 的 selectedKeys 获取准备就绪的通道集合

针对事件处理通道

接收就绪:

代表有客户端要连接,通过 SelectionKey 对象获取 ServerSocketChannel

调用 accept 方法接收请求客户端通道 SocketChannel

为 SocketChannel 通道注册可读数据事件到 Selector

将客户端 SocketChannel 添加到客户端集合 map 中

可读就绪:

代表客户端向服务器端发送了消息,通过 SelectionKey 对象获取 SocketChannel

调用 read 方法将数据读入通道,通过 Charset 的 decode 将数据解码

调用 dispatch 方法将消息转发给各个客户端

dispach方法:遍历客户端集合 map,通过 Channel 的 write 方法将消息发送给各个客户端

处理完事件后要清空 SelectionKey 集合,当下次该通道变成就绪时,Selector 才会再次将其放入 SelectionKey 中

public class NIOServer {

private int port = 8888;

// 用于字符集编解码

private Charset charset = Charset.forName("UTF-8");

// 用于接收数据的缓冲区

private ByteBuffer rBuffer = ByteBuffer.allocate(1024);

// 用于发送数据的缓冲区

private ByteBuffer sBuffer = ByteBuffer.allocate(1024);

// 用于存放客户端SocketChannel集合

private Map clientMap = new HashMap();

// 用于监听通道事件

private static Selector selector;

public NIOServer(int port) {

this.port = port;

try {

init();

} catch (IOException e) {

e.printStackTrace();

}<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值