有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java等待socket数据传输

我使用DataOutputStream通过网络传输数据,如下所示:

Socket socket = new Socket(ipAddress, port);
DataOutputStream dataOutputStream = new DataOutputStream(
                    socket.getOutputStream());

dataOutputStream.writeBytes("Stackoverflow");
// ...
System.exit(0);

如果我的应用程序过早终止,传输将中止,因此将失败,因为此时尚未发送所有数据

要解决此问题,我可以在终止之前手动等待一段时间:

try
{
    Thread.sleep(1000);
} catch (InterruptedException e)
{
    e.printStackTrace();
}

然而,这种解决方案是不好的。是否有一些“最佳实践”方法可以确保在终止我的应用程序之前已发送所有数据

编辑:
我无权访问服务器代码


共 (3) 个答案

  1. # 1 楼答案

    If my application terminates too early, the transmission will be aborted and therefore fail since after the execution of flush() not all data has been sent yet.

    数据是无缓冲的,因此每次写入都会立即发送数据。在你的情况下flush()什么都没做

    数据输出流。同花顺

    public void flush() throws IOException {
        out.flush();
    }
    

    调用OutputStream。同花顺

    public void flush() throws IOException {
    }
    

    Are there some "best practice" ways of assuring that all data has been sent before terminating my application?

    确保数据已发送的最佳方法是等待回复。让另一端发回一条消息,说它已经收到了数据,你可以退出,知道数据已经收到

    顺便说一句,当你完成了一个可关闭的资源,最好的做法是关闭它

  2. # 2 楼答案

    Set socket.setSendBufferSize(1024)也要确保在那里接收时,你读取了1024字节块

  3. # 3 楼答案

    默认情况下socket.close()会导致TCP连接正常关闭。在该过程中,TCP堆栈将未确认的数据传递给对等方

    dataOutputStream.flush();
    socket.close();
    

    如果你把SO_LINGER设置为零,那么它就不起作用了。 另一种方法是使用socket.shutdownOutput()

    dataOutputStream.flush();
    socket.shutdownOutput();