我的服务器/客户端对中有以下代码行:

BufferedOutputStream out = new BufferedOutputStream (clientSocket.getOutputStream());

它工作正常,代码运行良好,然后如果我将其修改为:
BufferedOutputStream out = new BufferedOutputStream (new BufferedOutputStream(clientSocket.getOutputStream()));

该应用程序的执行将在发送输出的地方停止。我实际上只是进行了修改,并且以这种方式对流非常陌生,尤其是套接字。

有明显的错误吗?

最佳答案

是的,这与BufferedOutputStream的行为一致,顾名思义,它会在发送之前缓冲输出。

当您将对象写入ObjectOutputStream时,字节将被传递到BufferedOutputStream,后者仅在缓冲区缓冲区已满时才将它们发送到套接字。因此,您的对象将在缓冲区中“徘徊”,等待刷新。因此,您的输出并不是真正的“发送”,因为它们还没有达到套接字。

如果您想继续使用BufferedOutputStream,则可能需要定期对其进行flush(),以保持进展。 flush()上的ObjectOutputStream方法将依次调用flush()上的BufferedOutputStream,这将清空缓冲区并将对象沿管道发送。

不过,我不得不问,为什么您根本需要使用BufferedOuputStream。您是否存在需要缓冲解决的性能问题?如果没有,那么就忽略它,它会增加您可能不需要的复杂性。

10-04 18:31