基於tcp協議的socket通訊阻塞問題

2021-08-10 12:34:54 字數 1149 閱讀 1003

tcp協議是可靠協議,就像打**,打**的一方撥完號之後,只有**被接起雙方才可以通訊。伺服器端

serversocket serversocket=new serversocket(port);

指定埠建立socket後就等待客戶端來鏈結,客戶端也建立socket指定要連線的遠端主機和埠號,

socket socket = new socket(inetaddress.getlocalhost(),5001);
一旦有客戶端連到伺服器,通過accept()方法就會獲得乙個新的socket,用來和客戶端進行通訊

socket socket = serversocket.accept();
通過以下方法,

inputstream is = socket.getinputstream();

outputstream os = socket.getoutputstream();

實現資料傳輸。然後就是客戶端和伺服器的通訊了。阻塞的地方就是,

while((n=is.read(b))!=-1)
每次讀的時候進入while就阻塞,後來加了標記

private

final

byte endflag = 0x04;

每次寫完就將筆記寫到末尾

os.write(end

flag);

然後讀的時候就判斷是否讀到了結束標記就可以了

while((n=is.read(b))!=-1)

public boolean isend(byte arr, int length)

一直用-1判斷結束都沒出現問題,socket這裡為什麼就出現了阻塞呢?

其實仔細想想不難發現,socket兩端握手通過連線上以後,伺服器和客戶端都處在一種接收的狀態,而此時可以通過其他執行緒來send資料到伺服器或客戶端,那麼相應的那端就會收到資料,這就是雙向通訊,所以只要連線沒有斷開,那麼流就一直聯通的,所以儘管你read的時候可以read到資料,但是你並不知道後面還有沒有,所以肯定到不了-1,所以就出現阻塞了。

不足之處,多指教

基於tcp協議的socket

serve服務端 import socket sk socket.socket 例項物件 sk.bind 127.0.0.1 8080 集合內設定ip和埠,利用bind方法 sk.listen 監聽資訊 conn,addr sk.accept 接受到資訊 while true ret conn.re...

基於TCP協議的socket程式設計

什麼是socket socket是應用層與tcp ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。所以,我們無需深入...

基於TCP協議的socket通訊

一 伺服器端 1 建立serversocket,即伺服器端的socket,繫結指定的埠,並偵聽此埠 serversocket server new serversocket 8888 2 呼叫accept 方法,開始偵聽,等待客戶端的連線,在未連線成功之前,處於阻塞狀態,返回的socket,用於與客...