DataOutputStream没有刷新

Ale*_*olz 0 java tcp flush dataoutputstream

我有一个Java客户端,它将UTF-8字符串发送到C#TCP-Server,我正在使用DataOutputStream来发送字符串.代码如下所示:

public void sendUTF8String(String ar) {
    if (socket.isConnected()) {
        try {
            dataOutputStream.write(ar.getBytes(Charset.forName("UTF-8")));
            dataOutputStream.flush();
        } catch (IOException e) {
            handleException(e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,冲洗似乎不正常.如果我发送两个字符串彼此接近,服务器只接收一个包含两个字符串的消息.如果我在调用之间执行Thread.sleep(1000),整个过程都有效,这显然不是解决方案.我错过了什么?

Car*_*icz 7

flush()不保证数据包被发送出去.您的TCP/IP堆栈可以自由捆绑数据以实现最高效率.更糟糕的是,您和目的地之间可能存在大量其他TCP/IP堆栈,并且它们可以自由地执行相同操作.

我认为你不应该依赖数据包捆绑.在数据中插入逻辑终结符/分隔符,您将处于安全的一面.

  • 我也开始做出回应,但它只是补充说,即使你可以可靠地冲洗(通常你可以),接收端的缓冲可能会弄乱你在客户端上可以做的任何冲洗.但无论你在客户端做什么,服务器仍将缓冲其套接字数据. (3认同)