Selector和非阻塞網路程式設計

2021-09-26 05:37:06 字數 1400 閱讀 8001

傳統的 網路程式設計

​ tcp serversocket socket (阻塞式)

​ udp datagramsocket datagrampacket

serversocketchannel是乙個基於通道的socket***,等同於serversocket類。socketchannel是乙個基於通道的客戶端套接字,等同於socket類。

public

static

void

main

(string[

] args)

throws ioexception

public

static

void

main

(string[

] args)

throws ioexception

要使用selector,得向selector註冊channel,然後呼叫它的select()方法。這個方法會一直阻塞到某個註冊的通道有事件就緒。一旦這個方法返回,執行緒就可以處理這些事件,事件的例子有如新連線進來,資料接收等。

​ 選擇器提供選擇執行已經就緒的任務的能力.從底層來看,selector提供了詢問通道是否已經準備好執行每個i/o操作的能力。selector 允許單執行緒處理多個channel。僅用單個執行緒來處理多個channels的好處是,只需要更少的執行緒來處理通道。事實上,可以只用乙個執行緒處理所有的通道,這樣會大量的減少執行緒之間上下文切換的開銷。

服務端

public

static

void

main

(string[

] args)

throws ioexception

else

if(selectionkey.

isreadable()

)if(len==-1

) socketchannel.

close()

;}iterator.

remove()

;}}}

客戶端

public

static

void

main

(string[

] args)

throws ioexception

sc.close()

;}

阻塞和非阻塞

在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...

阻塞和非阻塞

在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...

linux網路程式設計中阻塞和非阻塞socket的區別

阻塞socket和非阻塞socket 讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀...