乙個簡單的BIO通訊程式

2021-10-08 05:46:33 字數 2292 閱讀 8293

同步阻塞io(簡稱bio)是最傳統的一種io模型,即在讀和寫的過程中會發生阻塞現象。

我們編寫乙個簡單的服務端和客戶端程式,尋找一下同步阻塞i/o的弊端

timeserver

public

class

timeserver

}catch

(exception e)

finally}}

}

服務端建立乙個serversocket,然後通過無限迴圈的方式來監聽客戶端連線,如果沒有客戶端接入,則主線程會阻塞在accept操作上。當有客戶端連線接入後,啟動乙個執行緒來處理,具體處理交給timeserverhandler,這是個runnable,使用它為建構函式的引數建立乙個新的客戶端執行緒處理這條socket鏈路。

timeserverhandler

public

class

timeserverhandler

implements

runnable

public

void

run(

) system.out.

println

("the time server receive order : "

+ body)

;// 如果讀到了非空值,對內容進行判斷,如果請求訊息為查詢時間的指令 query time order,則獲取當前系統時間

// 通過printwriter的println函式傳送給客戶端,然後退出迴圈if(

"query time order"

.equalsignorecase

(body)

)else

// ★ 通過printwriter傳送給客戶端

out.

println

(currenttime);}

}catch

(ioexception e)

catch

(ioexception e1)

}// 釋放輸出流

if(out != null)

// 釋放socket套接字控制代碼資源if(

this

.socket != null)

catch

(ioexception e1)}}

}}

timeserverhandler通過socket讀取輸入流,每次讀一行,如果讀到了尾部,則返回null,退出迴圈。如果讀到了非空值,對非空值進行判斷,如果請求的訊息為查詢時間的指令,則獲取當前最新的世界,通過printwriter的println函式傳送給客戶端,最後退出迴圈。

timeclient

public

class

timeclient

catch

(ioexception e)

finally

catch

(ioexception e1)

}// 釋放輸出流

if(out != null)

// 釋放socket套接字控制代碼資源

if(socket != null)

catch

(ioexception e1)}}

}}

通過printwriter向服務端傳送指令,然後通過bufferreader的readline讀取響應內容。

分別執行服務端和客戶端,執行結果如下:

服務端執行結果:

the time server receive order : query time order

客戶端執行結果:

send order to server succeed.

now is : sat jul 18 23:19:43 cst 2020

到此同步阻塞io的示例程式講解完畢

talk is cheap , show me the picture

最後通過一張圖來說明bio的通訊模型

我們發現,bio主要的問題在於每當有乙個新的客戶端請求接入時,服務端必須建立乙個新的執行緒處理客戶端,乙個執行緒只能處理乙個客戶端連線。在成千上萬個客戶端併發連線的情況下,這種模型無法滿足高效能、高併發接入的場景。

乙個簡單的串列埠通訊程式

從2015年到現在,將近4年沒有寫程式了,這次是乙個朋友要我做物聯網的專案,要學習一些新東西,做起來再說。主要 private void sp datareceived object sender,serialdatareceivedeventargs e else textbox2.text re...

乙個簡單的verlig程式 乙個簡單C程式的介紹

我們前面學了c語言的一些理論知識,今天通過乙個簡單的程式先來看一看c語言程式是什麼樣子。然後再對程式中的 進行介紹。這個語句的功能是進行有關的預處理操作。include稱為檔案包含命令,後面尖括號的內容稱為標頭檔案或首檔案。此處指包含stdio.h系統標頭檔案,在下面主函式中使用的printf 函式...

寫乙個簡單的通訊錄程式

include include include define size 100 int person 0 表示以新增的人數 宣告結構體 struct info typedef struct info info 結構體改名 void welcome void menu 新增聯絡人 void addin...