我正在尝试使用以下命令将字符串写入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”后立即刷新缓冲区,从而导致在流上发送两个数据包。第一个是单个字符;第二个是单个字符。第二个包含字符串的其余部分。在服务器的最新更新之前,这在Linux上可以正常工作。

有什么方法可以强制OutputStream或BufferedOutputStream将write()视为原子操作,或者直到flush()才传输?

我也尝试过

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


具有相同的结果。

最佳答案

问题出在SSLSocket中CDC编码实现的更改。为了避免安全问题,它总是在第一个字节之后中断消息。

有关完整说明,请参见stackoverflow.com/a/33360518/4454122

09-30 23:39