public
class
tcpnioclient
}// 5. 準備乙個資料存入到緩衝區
bytebuffer buffer = bytebuffer.
wrap
("你好,伺服器"
.getbytes()
);// 6. 通過socketchannel 符合tcp協議socket要求channel物件傳送
socket.
write
(buffer)
;new
scanner
(system.in)
.nextline()
;}}
/**
* 使用serversocketchannel nio非阻塞方式,完成服務端**
* * 1. 開啟伺服器
* serverscoketchannel
* 2. 開啟selector 大哥
* selector物件
* 3. 伺服器serversocketchannel bind監聽埠號
* 8848埠
* 4. 設定非阻塞狀態
* configureblocking(false)
* 5. serversocketchannel 註冊--> selector
* register(selector, op_accept);
* * 6. selector大哥開始忙活
* 6.1 獲取連線,註冊對應的socket
* 6.2 監聽讀寫事件
* 6.2.1 讀資料。客戶端傳送資料到伺服器
* 6.2.2 寫資料。傳送資料資料給客戶端
*/public
class
tcpnioserver
// 6.2 監聽讀寫事件
// 得到當前selector中所有的selectionkey
iterator
selectionkeys = selector.
selectedkeys()
.iterator()
;while
(selectionkeys.
hasnext()
)// 6.2.2 判斷客戶端目前是可讀狀態,獲取客戶端傳送給伺服器的資料
if(selectionkey.
isreadable()
)// 處理完進行乙個移除當前selectionkey操作
selectionkeys.
remove()
;}}}
}
public
class
chatclient
}this
.username = username;
system.out.
println
("客戶端 "
+ username +
" 準備就緒");
}/*這裡需要完成兩個方法,乙個是傳送資料到伺服器,乙個是接受伺服器傳送的資料
*//** * 傳送資料到伺服器,用於廣播訊息,群聊
** @param message 指定的訊息
*/public
void
sendmsg
(string message)
throws ioexception
/* stringbuffer
執行緒安全,效率低
stringbuilder
執行緒不安全,效率高
*/message = username +
":"+ message;
bytebuffer buffer = bytebuffer.
wrap
(message.
getbytes()
);socket.
write
(buffer);}
public
void
receivemsg()
throws ioexception
}}
public
class
chatserver
/** * 伺服器幹活方法,指定客戶端繫結,資料接收和**
*/public
void
start()
/* selectedkeys:
獲取當前所有發生事件操作的對應selectionkey set集合
*/iterator
iterator = selector.
selectedkeys()
.iterator()
;while
(iterator.
hasnext()
)// 2. 接收資料**
if(key.
isreadable()
) iterator.
remove()
;}}}
catch
(ioexception e)
}/**
* 從指定的selectionkey中讀取資料
** @param key 符合op_read 要求的selectionkey
*/public
void
readmsg
(selectionkey key)
throws ioexception
}/**
* 廣播方法,該方法是**訊息,但是不要發給自己
** @param self 當前傳送資料的客戶端
* @param message 訊息
*/public
void
broadcast
(socketchannel self, string message)
throws ioexception }}
public
static
void
main
(string[
] args)
throws ioexception
}
public
class
chatclientthread
chatclient chatclient =
newchatclient
(username)
;// 接收訊息
newthread((
)->
catch
(ioexception
| interruptedexception e)}}
).start()
;// 傳送訊息
while
(scanner.
hasnextline()
)}}
NIO框架(4) 聊天室
前幾篇文章介紹了nio的幾個主要構件,包括緩衝區buffer 傳輸通道channel 訊息選擇器selector以及訊息類別selectionkey,接下來我們通過乙個聊天室的例子來了解一下以上各種元件的用法。聊天室分為伺服器端和客戶端,伺服器端接收客戶端發來的請求訊息,並生成乙個channel來處...
簡單網路聊天室實現
簡單網路聊天室實現 by clin003 from http clin003.com 或http blog.csdn.net clin003 學習目的 初步認識網路程式設計概念 認識執行緒的型別的宣告及實現 設計乙個簡單的s c模式結合的聊天程式 進一步認識元件的使用 實現部分 定義乙個執行緒型別t...
JSP網路聊天室
1.登入頁面 在頁面輸入使用者名稱密碼,提交到登入邏輯頁面 2.登入邏輯頁面 調資料庫判斷使用者名稱密碼的正確性 正確 跳到聊天室介面並且儲存使用者名稱 錯誤 返回登入介面 3 聊天室介面 1.拿到儲存的使用者名稱 2.將傳送的訊息傳到聊天室邏輯頁面 4.聊天室邏輯頁面 2 邏輯思路圖 3 例項 l...