首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java NIO 實戰:單線程高性能 TCP Echo Server 完整實現

     編輯:Java 相關知識

架構概覽

使用 Selector 多路複用,單線程處理海量連接。核心組件:

  • NioWorker:封裝 Selector 與 select() 循環,管理 NioSession 註冊/處理。
  • NioSession:統一介面,封裝 SelectableChannel、interestOps、process() 邏輯。
  • NioServerSession:封裝 ServerSocketChannel,OP_ACCEPT,接受連接並創建 NioEchoSession。
  • NioEchoSession:封裝 SocketChannel,狀態機處理讀/寫循環。

關鍵代碼片段

NioWorker.run() 事件循環

while (_run) {
    _sel.select();
    for (SelectionKey key : _sel.selectedKeys()) {
        ((NioSession) key.attachment()).process();
        key.cancel(); // 或 itr.remove()
    }
    // 註冊新增 Session
    synchronized (_added) {
        for (NioSession s : _added) {
            SelectionKey key = s.channel().register(_sel, s.interestOps(), s);
            s.registered(key);
        }
        _added.clear();
    }
}

NioEchoSession 狀態模式

public abstract class EchoState {
    abstract void process(NioEchoSession s) throws IOException;
    abstract int interestOps();
    static EchoState readState()  { return _read; }
    static EchoState writeState() { return _write; }
}
class ReadState extends EchoState {
    void process(NioEchoSession s) {
        int n = s._channel.read(s._buf);
        if (n == -1) { s.close(); return; }
        if (n > 0) { s._buf.flip(); s.setState(writeState()); }
    }
    int interestOps() { return SelectionKey.OP_READ; }
}
class WriteState extends EchoState {
    void process(NioEchoSession s) {
        s._channel.write(s._buf);
        if (!s._buf.hasRemaining()) { s._buf.clear(); s.setState(readState()); }
    }
    int interestOps() { return SelectionKey.OP_WRITE; }
}

NioEchoSession 委派 process() 給當前 EchoState,setState() 切換狀態並更新 interestOps。

啟動入口 NioEchoServer

public class NioEchoServer implements Runnable {
    public void run() {
        ServerSocketChannel serv = ServerSocketChannel.open();
        serv.socket().bind(new InetSocketAddress(7));
        serv.configureBlocking(false);
        NioWorker worker = new NioWorker(Selector.open());
        worker.add(new NioServerSession(serv, worker));
        worker.run(); // 阻塞循環
    }
    public synchronized void shutdown() { worker.stop(); wait(); }
    public static void main(String[] args) { new NioEchoServer().run(); }
}

測試驗證

  1. 啟動程式。
  2. 多開終端:telnet localhost 7。
  3. 輸入字符,即時回顯;多客戶端並發無阻塞。

設計亮點

  • 開閉原則:新增協議只需實作 NioSession,無需修改 NioWorker。
  • 狀態模式:清晰分離讀/寫邏輯,避免巨大 if-else。
  • 無鎖設計:單線程串行處理,簡化併發控制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved