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();
具有相同的結果。
庫存的OpenJDK'BufferedOutputStream' [僅僅刷新上寫當緩衝器滿](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/ 687fd7c7986d/SRC /共享/類/爪哇/ IO/BufferedOutputStream.java#L94)。 'WriteString()'之前有沒有寫入流?這是什麼JRE運行?我無法複製。 – dhke
我正在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
正如@dhke所說,當緩衝區已滿或調用'flush()'時,緩衝流只會刷新。既然'B'之後的情況都不是這樣,它對於緩衝流不是問題,或者甚至是Java的問題。這可能是操作系統的一個問題,尤其是因爲您說它在操作系統更新後開始。 – Andreas