本案例**於《netty權威指南》
buffer:用於訪問資料,最主要的是bytebuffer
1public
class
server
5 }
建立乙個任務serverhandler,然後建立一條執行緒,啟動執行該任務。
1public
class serverhandler implements
runnable catch
(ioexception e) 18}
1920
public
void
run()
30 } catch
(throwable t) 33}
3435}36
37private
void handleinput(selectionkey key) throws
ioexception
48if
(key.isreadable()) else
if (readbytes < 0) else
70 ; //
讀到0位元組,忽略71}
72}73}
7475
private
void
dowrite(socketchannel channel, string response)
76throws
ioexception 84}
85 }
步驟:
1、建立乙個selector和serversocketchannel例項
2、配置serversocketchannel例項為非阻塞
3、serversocketchannel例項bind埠
4、將serversocketchannel例項註冊到selector上,監聽op_accept事件
下面的任務在server建立的新的執行緒中執行,不影響主線程執行其他邏輯
5、之後進入死迴圈
5.1、使用select.select()阻塞等待就緒事件(這裡是等待op_accept事件),一旦有有就緒事件到達,立即向下執行
5.2、使用selector.selectedkeys()獲取已經就緒的selectionkey(即op_accept/op_conect/op_read/op_write)集合,之後迴圈遍歷
5.3、從迭代器刪除該selectionkey,防止下一次再被遍歷到
5.4、如果selectionkey==op_accept,則通過serversocketchannel.accept()建立socketchannel,該socketchannel是後續真正的與客戶端的socketchannel進行通訊的實體
5.5、配置新建立的socketchannel例項為非阻塞,然後將該socketchannel例項註冊到selector例項上,監聽op_read事件
5.6、等客戶端發出請求資料時,此處監聽到selectionkey==op_read,則建立bytebuffer例項,將socketchannel中的資料讀取到bytebuffer中,然後再建立bytebuffer將資訊寫回到socketchannel(也就是說資料的讀寫一定要通過buffer)
1public
class
client
5 }
建立乙個任務clienthandler,然後建立一條執行緒,啟動執行該任務。
1public
class clienthandler implements
runnable catch
(ioexception e) 19}
2021
public
void
run() catch
(ioexception e)
28while (true
) 37 } catch
(exception e) 41}
42}4344
private
void handleinput(selectionkey key) throws
ioexception else
53 system.exit(1);//
連線失敗,程序退出
54 } else
if(key.isreadable()) else
if (readbytes < 0) else
68 ; //
讀到0位元組,忽略69}
70}7172}73
74private
void doconnect() throws
ioexception else
80socketchannel.register(selector, selectionkey.op_connect);81}
8283
private
void dowrite(socketchannel sc) throws
ioexception
92 }
步驟:
1、建立乙個selector和socketchannel例項
2、配置socketchannel例項為非阻塞
下面的任務在cilent建立的新的執行緒中執行,不影響主線程執行其他邏輯
3、socketchannel.connect連線到server端,如果連線沒有馬上成功,將該socketchannel例項註冊到selector上,監聽op_connect事件;如果連線成功,將該socketchannel例項註冊到selector上,監聽op_read事件,之後寫資料給server端
4、之後進入死迴圈
4.1、使用select.select()阻塞等待就緒事件,一旦有有就緒事件到達,立即向下執行
4.2、使用selector.selectedkeys()獲取已經就緒的selectionkey(即op_accept/op_conect/op_read/op_write)集合,之後迴圈遍歷
4.3、從迭代器刪除該selectionkey,防止下一次再被遍歷到
4.4、如果selectionkey==op_connect,將該socketchannel例項註冊到selector上,監聽op_read事件,之後寫資料給server端;如果監聽到selectionkey==op_read,則建立bytebuffer例項,將socketchannel中的資料讀取到bytebuffer中
c primer第一章大習題
最近在看c primer 第一章主要是c 的一些基礎 介紹類相關的東西 基本上沒什麼特別的。主要是 這個書店程式的標頭檔案 尋思著自己寫一下 在寫的過程中 產生了乙個疑問?過載運算子的時候 發現在過載函式內可以訪問新生成的物件和引入的物件的私有成員 以前都沒注意到。比如下面這個 sales item...
python第一章筆記 第一章 基礎
參與除法的兩個數中有乙個數為浮點數,結果也為浮點數 如 1.0 2,1 2.0,1.0 2.0 python print 1.0 2 結果 0.5 print 1 2.0 結果 0.5 print 1.0 2.0 結果 0.5 整數 整數,計算結果的小數部分被截除,只保留整數部分 不會四捨五入 如 ...
第一章 緒論
1.16 void print descending int x,int y,int z 按從大到小順序輸出三個數 print descending 1.17 status fib int k,int m,int f 求k階斐波那契序列的第m項的值f gender char schoolname 校...