BufferedReader 的 readLine 方法姑蓝,只要讀到流結(jié)束或者流關(guān)閉,就會返回 null
在讀取文件的時候吕粗,文件結(jié)尾就是流的結(jié)尾纺荧,但對于 Socket 而言不是的。不能認(rèn)為流中數(shù)據(jù)讀完了就是流的結(jié)尾了颅筋。Socket 流還在宙暇,還是能夠繼續(xù)讀寫的。所以用 Socket 的輸入流封裝的 BufferedReader 調(diào)用 readLine 方法议泵,是不會返回 null 的占贫。也就發(fā)生阻塞了。
解決方案:
第一種:讀取 socket 流不用 BufferedReader先口,就用 InputStream
第二種:客戶端發(fā)送的時候型奥,末尾添加換行符。取系統(tǒng)換行符 System.lineSeparator ()
注意:
使用 readLine 讀取一行數(shù)據(jù)碉京,并不是很好的方式厢汹。因為并不知道這一行到底有多大。理論上是可以被惡意攻擊的收夸。
對于網(wǎng)絡(luò)編程而言坑匠,請求與響應(yīng)的數(shù)據(jù)格式要約定好。
① 每次都讀取固定大小
② 每次讀取的報文大小由報文頭決定