2017-06-28 69 views
1

我的「M嘗試使用你能阻止BufferedOutputStream(java)傳輸嗎?

public SSLSocket   mClient; 
private BufferedOutputStream mOutputStream; 

.... 

mOutputStream = new BufferedOutputStream(mClient.getOutputStream()); 

public synchronized void WriteString(String asciiString) 
{ 
    mOutputStream.write(asciiString.getBytes()); 
    mOutputStream.write(0); 
    mOutputStream.flush(); 
} 

.... 

WriteString("BASEL ..."); 

我使用這種方法成功地發送不同的字符串,然後(響應於消息通過該流接收的)嘗試發送上述消息寫一個串到OutputStream

在此調用中,寫入操作在寫入「B」後立即刷新緩衝區,從而導致通過流發送兩個數據包:第一個是單個字符;第二個包含字符串的其餘部分。這在Linux上正常工作,直到服務器的最近更新。

有沒有辦法強制OutputStream或BufferedOutputStream將write()作爲原子操作對待,或者直到flush()才傳輸?

我也曾嘗試

private DataOutputStream mOutputStream; 
mOutputStream.writeBytes(asciiString); 
mOutputStream.writeByte(0); 
mOutputStream.flush(); 

具有相同的結果。

+1

庫存的OpenJDK'BufferedOutputStream' [僅僅刷新上寫當緩衝器滿](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/ 687fd7c7986d/SRC /共享/類/爪哇/ IO/BufferedOutputStream.java#L94)。 'WriteString()'之前有沒有寫入流?這是什麼JRE運行?我無法複製。 – dhke

+0

我正在Amazon Web服務器上運行。 Java版本 「1.6.0_41」 OpenJDK的運行時環境(IcedTea6 13年1月13日)(亞馬遜1.13.13.1.77.amzn1-x86_64的) OpenJDK的64位服務器VM(建立23.41-B41,混合模式) 這是寫入流的第二條消息。第一個消息使用相同的功能在單個數據包中傳輸。 – Alex

+0

正如@dhke所說,當緩衝區已滿或調用'flush()'時,緩衝流只會刷新。既然'B'之後的情況都不是這樣,它對於緩衝流不是問題,或者甚至是Java的問題。這可能是操作系統的一個問題,尤其是因爲您說它在操作系統更新後開始。 – Andreas

回答