1

を使用して文字列を OutputStream に書き込もうとしています

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 ..." );

このメソッドを使用して別の文字列を正常に送信し、(ストリームを介して受信したメッセージに応答して) 上記のメッセージを送信しようとしました。

この呼び出しでは、"B" が書き込まれた直後に書き込み操作によってバッファーがフラッシュされ、その結果、ストリームを介して 2 つのパケットが送信されます。1 つ目は 1 文字です。2 番目には残りの文字列が含まれます。サーバーが最近更新されるまで、これは Linux で正しく機能していました。

OutputStream または BufferedOutputStream に、write() をアトミック操作として強制的に処理させたり、flush() まで送信させないようにする方法はありますか?

私も試してみました

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

同じ結果で。

4

1 に答える 1

0

問題は、SSLSocket での CDC エンコーディングの実装の変更にありました。セキュリティ上の問題を回避するために、常に最初のバイトの後でメッセージを分割します。

完全な説明については、stackoverflow.com/a/33360518/4454122を参照してください。

于 2017-06-30T16:49:45.093 に答える