NIO實現網路聊天室

2021-10-03 23:54:49 字數 3502 閱讀 8230

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...