SelectionKey
-
表示 Selector 和网络通道的注册关系,共四种(全是常量):
- Int OP_ACCEPT:有新的网络连接可以接受,值为 16 (1 << 4)
- Int OP_CONNECT: 代表连接已经建立,值为 8 (1 << 3)
- Int OP_READ:代表读操作,值为 1 (1 << 0)
- Int OP_WRITE: 代表写操作,值为 4 (1 << 2)
-
相关方法:
java
public abstract Selector selector();//得到与之关联的Selector对象
public abstract SelectableChannel channel();//得到与之关联的通道
public final Object attachment();//得到与之关联的共享数据
public abstract SelectionKey interestOps(int ops);//设置或改变监听事件
public final boolean isAcceptable();//是否可以 accept
public final boolean isReadable();//是否可以读
public final boolean isWritable();//是否可以写

ServerSocketChannel
- ServerSocketChannel 在服务器端监听新的客户端 Socket 连接
- 相关方法:
- public static ServerSocketChannel open(),得到一个ServerSocketChannel通道
- publle final ServerSocketChannel bind(SocketAddress local),设置服务器端端口 号
- publle final SelectableChannel configureBlocking(boolean block), 设置阻塞或非 阻塞模式,取值false表示采用非阻塞模式
- publlc SocketChannel accept(),接受一个连接,返回代表这个连接的通道对象
- public final SelectionKey register(Selectorsel,int ops), 注册一个选择器并设置 监听事件

SocketChannel
- SocketChannel,网络IO通道,具体负责进行读写操作。NIO 把缓冲区的数据写入通道,或者把通道里的数据读到缓冲区。
- 相关方法:
- public static SocketChannel open():/得到一个SocketChannel通道
- public final SelectableChannel configureBlocking(boolean block);//设置阻塞或非阻塞模式,取值false表示采用非阻塞模式
- public boolean connect(SocketAddress remote);//连接服务器
- public boolean finishConnect();//如果上面的方法连接失败,接下来就要通过该方法完成连接操作
- public int write(ByteBuffer src);//往通道里写数据
- public int read(ByteBuffer dst);//从通道里读数据
- public final SelectionKey register(Selectorsel,int ops,Object att);//注册一个选择器并设置监听事件,最后一个参数可以设置共享数据
- public final void close();//关闭通道

NIO实现聊天室功能(选修)
-
要求:
- 编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)
- 实现多人群聊
- 服务器端:可以监测用户上线,离线,并实现消息转发功能
- 客户端:通过 channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得)
-
GroupChatServer



- GroupChatClient


