第一章 java nio三大元件與使用姿勢

2021-09-07 18:47:03 字數 3323 閱讀 7212

本案例**於《netty權威指南》

buffer:用於訪問資料,最主要的是bytebuffer

1

public

class

server

5 }

建立乙個任務serverhandler,然後建立一條執行緒,啟動執行該任務。

1

public

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)

1

public

class

client

5 }

建立乙個任務clienthandler,然後建立一條執行緒,啟動執行該任務。

1

public

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