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会再次将其放入已选择键集中。 */