同步阻塞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.到此同步阻塞io的示例程式講解完畢now is : sat jul 18 23:19:43 cst 2020
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...