Socket編程中,儘量用PrintWriter取代BufferedWriter

簡單化德把問題說一下吧!最近試着編寫socket聊天小軟件。

在服務器端和客戶端產生一個Socket 後,

兩邊各自用getIputStream()和getOutputStream()方法,構造各自的輸入輸出流。

其中服務器端的Socket ss

BufferedReader is=new BufferedReader(new InputStreamReader(ss.getInputStream()) );
PrintWriter  os=new PrintWriter (new OutputStreamWriter(ss.getOutputStream()) );

os.writer("一個亂七八糟的字符串");

客戶端的Socket cs

BufferedReader is=new BufferedReader(new InputStreamReader(cs.getInputStream()) );
PrintWriter  os=new PrintWriter (new OutputStreamWriter(cs.getOutputStream()) );

System.out.println(is.readLine());

(當然這兩個肯定不是一個類文件中噢!)

按理說,應該是ss的 os對應着cs的 is.  爲什麼在服務器端寫入了,在客戶端這邊沒法讀出來呢?

另外,如果服務器端用os.println("字符串");就好使了。

請問這是問什麼? 

 

 答:

問題主要集中在,爲什麼客戶端調用了write()和flush()後,服務器端依然read不到數據。因爲socket.getOutputStream()取到的實現類是java.net.SocketOutputStream,這個類並沒有覆寫flush方法,它的父類java.io.FileOutputStream也沒有覆寫,於是最終就調到了最頂層java.io.OutputStream的flush()方法,這就噁心了,這個方法是空的。於是...

因此,還是使用Reader.readLine()和Writer.println()來處理socket吧,或者直接使用NIO。

(注意,SocketOutputStream類在JavaDoc中不存在,只在源碼中有,他是個受保護的類。)

發佈了64 篇原創文章 · 獲贊 5 · 訪問量 63萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章