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

丰木
325 声望19 粉丝

遇见超乎想象的自己!


引用和评论

0 条评论