java - 你能阻止 BufferedOutputStream (java) 传输吗?

标签 java dataoutputstream bufferedoutputstream

我正在尝试使用

将字符串写入 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完整解释

关于java - 你能阻止 BufferedOutputStream (java) 传输吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44807153/

相关文章:

java - 如何从字符串写入二进制文件并将其再次检索到字符串?

java - 如何区分复选框字段和一组单选按钮

java - 删除请求 JMETER 中的属性

java - 将 JSP 中的值添加到 MySQL 中的另一个表

java - 当使用 VSCode 命令编译 C++ 时,它使用的是奇怪的

java - 如何知道二进制文件的字节数?

java - 将 ByteArrayOutputStream 传递到 DataOutputStream 的构造函数中

bash - docker 日志和缓冲输出

Java,使用套接字: is it necessary use bufferedinputstream and bufferedoutputstream?发送和接收文件

java - 当你 write(byte[] b) 到 BufferedOutputStream 时会发生什么? ( java )