使用socket讀取伺服器傳送的資料問題

2021-07-30 13:14:04 字數 863 閱讀 5483

剛剛專案使用到socket進行資料的傳送,其中資料的讀取問題著實

費了老大的勁,以此分享希望能讓有緣人少走彎路。

new thread()  catch (ioexception e) 

}}.start();

對於使用readline讀取資料的乙個問題就是,無法走到while後面去,究其原因:

1.誤以為readline()是讀取到沒有資料時就返回null(因為其它read方法當讀到沒有資料時返回-1),而實際上readline()是乙個阻塞函式,當沒有資料讀取時,就一直會阻塞在那,而不是返回null;因為readline()阻塞後,system.out.println(message)這句根本就不會執行到,所以在接收端就不會有東西輸出。要想執行到system.out.println(message),乙個辦法是傳送完資料後就關掉流,這樣readline()結束阻塞狀態,而能夠得到正確的結果,但顯然不能傳一行就關一次資料流;另外乙個辦法是把system.out.println(message)放到while迴圈體內就可以。

2.readline()只有在資料流發生異常或者另一端被close()掉時,才會返回null值。

3.如果不指定buffer大小,則readline()使用的buffer有8192個字元。在達到buffer大小之前,只有遇到」/r」、」/n」、」/r/n」才會返回。

小結,使用readline()一定要注意:

1、讀入的資料要注意有/r或/n或/r/n

2、沒有資料時會阻塞,在資料流異常或斷開時才會返回null

3、使用socket之類的資料流時,要避免使用readline(),以免為了等待乙個換行/回車符而一直阻塞

4、或者是伺服器端在傳送完資料就進行關閉

Socket 伺服器設計核心 傳送訊息的快取

伺服器對全域性傳送訊息必須有個快取。原因如下 假設伺服器的運算瓶頸是每秒鐘傳送100個資訊 如果這個時候伺服器本身產生的傳送訊息資料遠遠大於了這個數量,會導致伺服器宕機,即使不宕機也執行出現異常。而且有可能突然間訪問量暴增,如果在socket這一層面可以阻止過高的訪問量,那麼剩下的就是運算瓶頸。這2...

伺服器模型 socket

伺服器模型 一 迴圈伺服器 迴圈伺服器在同一時刻只可以相應乙個客戶端請求 二 併發伺服器 併發伺服器在同一時刻可以相應多個客戶端的請求.迴圈伺服器 1.udp伺服器 udp迴圈伺服器的實現非常簡單 udp伺服器每次從套接字上讀取乙個客戶端的請求,處理,然後將結果返回給客戶機.可以用下面的演算法來實現...

Socket程式設計 伺服器向客戶端傳送資料

最近想學習一下底層的socket程式設計的東西,了解一下具體的原理,而不只是使用封裝好的類庫。從c語言中文網教程上學習的,記錄一下吧。使用vs2010為開發環境,可能由於缺少庫的原因?codeblocks沒法使用.伺服器向客戶端傳送資料 hello world 執行結果 客戶端 源 伺服器端 inc...