NIO 简易版聊天室
1. server端:
package com.niewj.niochat;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
/**
* Created by niewj on 2020/9/22 15:18
*/
public class NioChatServer {
public static final int PORT = 7777;
public static final int BUF_SIZE = 512;
private Selector selector;
private ServerSocketChannel serverChannel;
public static void main(String[] args) throws IOException {
NioChatServer server = new NioChatServer();
server.init();
server.listen();
}
private void listen() throws IOException {
// 关联成功后 轮询监听客户端连接
while (true) {
// 阻塞方法: 直到有注册的事件发生
int readyChannels = selector.select();
if (readyChannels == 0) {
continue;
}
// 收集监听的事件
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> iter = keys.iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
if (key.isAcceptable()) {
// 处理-accept事件
handleAcceptable(key);
}
if (key.isReadable()) {
// 处理-read 事件
readDataFromSocket(key);
}
/** 注意每次 iter.remove():
* Selector不会自己移除SelectionKey实例, 必须在处理完Channel时自己移除。
* 下次该通道就绪时,Selector会再次将其放入已选择键集中。 */
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。