BufferedReader的readLine方法,只要讀到流結束或者流關閉,就會返回null
在讀取文件的時候,文件結尾就是流的結尾,但對於Socket而言不是的。不能認為流中數據讀完了就是流的結尾了。Socket流還在,還是能夠繼續讀寫的。所以用Socket的輸入流封裝的BufferedReader調用readLine方法,是不會返回null的。也就發生阻塞了。
解決方案:
第一種:讀取socket流不用BufferedReader,就用InputStream
第二種:客戶端發送的時候,末尾添加換行符。取系統換行符 System.lineSeparator()
注意:
使用readLine讀取一行數據,並不是很好的方式。因為並不知道這一行到底有多大。理論上是可以被惡意攻擊的。
對於網絡編程而言,請求與響應的數據格式要約定好。
① 每次都讀取固定大小
② 每次讀取的報文大小由報文頭決定