詳解NIO如何實現(xiàn)群聊?
1. 實現(xiàn)步驟
構(gòu)建Selector以及服務(wù)端監(jiān)聽
通道啟動監(jiān)聽并處理建立連接請求
處理讀數(shù)據(jù)群發(fā)數(shù)據(jù)
實現(xiàn)客戶端測試
2. 服務(wù)端實現(xiàn)
2.0 服務(wù)端完整代碼
服務(wù)端的主要功能如下 :
1. 開放監(jiān)聽端口,方法ChatServer構(gòu)造方法
2. 處理鏈接請求,方法listener實現(xiàn)連接的建立
3. 讀取消息內(nèi)容,方法readData
4. 轉(zhuǎn)發(fā)消息給當(dāng)前所有在線的人,方法sendData2All




2.1 構(gòu)建Selector以及服務(wù)端監(jiān)聽通道
當(dāng)ChatServer對象被創(chuàng)建時具體實現(xiàn)步驟如下:
1. 創(chuàng)建serverSocketChannel對象
2. 設(shè)置處理模式為非阻塞模式
3. 綁定監(jiān)聽端口
4. 將channel注冊到selector中

2.2 實現(xiàn)監(jiān)聽并處理建立連接請求
連接請求處理實現(xiàn)步驟:
1. 獲得所有有事件的key, 通過key就可以拿到用戶的SocketChannel
2. 循環(huán)遍歷每一個key,判斷當(dāng)前是讀事件,還是建立連接事件
3. 如果是建立連接事件則直接將該通道注冊到selector中
4. 如果是讀數(shù)據(jù)事件就交給具體的讀數(shù)據(jù)方法處理數(shù)據(jù)

2.3 處理讀數(shù)據(jù)
數(shù)據(jù)處理的具體實現(xiàn)步驟 :
1. 通過key獲取和用戶連接的通道(相當(dāng)于輸入流)
2. 獲取通道的數(shù)據(jù)并打印
3. 將數(shù)據(jù)轉(zhuǎn)發(fā)給其他在線用戶

2.4 群發(fā)數(shù)據(jù)實現(xiàn)
數(shù)據(jù)群發(fā)實現(xiàn)步驟:
1. 當(dāng)前在線用戶實際上就是selector中所有注冊的key,也就是在線的用戶
2. 通過key拿到和用戶的鏈接講消息轉(zhuǎn)發(fā)出去

2.5 啟動服務(wù)端

3. 客戶端實現(xiàn)
客戶端實現(xiàn) :
1. 首先創(chuàng)建SocketChannel對象并鏈接到具體的服務(wù)器
2. 將通道注冊到selector中
3. 開啟一個新的線程監(jiān)聽selector中所有key的事件
4. 在主線程中循環(huán)阻塞獲取用戶的輸入

