【问题标题】:Java: Writing to socket with DataOutputStream slows down, then stopsJava:使用 DataOutputStream 写入套接字变慢,然后停止
【发布时间】:2013-02-02 03:12:38
【问题描述】:
while (true) {
    loc = getLocationOnScreen();

    out.writeLong((long)loc.getX());
    out.writeLong((long)loc.getY());
    out.flush();

    i++;
    System.out.println(i);

}

这段代码会愉快地运行大约 3 秒钟,然后变慢,然后停止。

i 大约以16491 结尾,永远不会继续增加。这是怎么回事?

【问题讨论】:

  • 你的直播在哪里结束?
  • @bmorris591 不太清楚你的意思。我对 Java 套接字很陌生,我只是在破解一个简单的项目。
  • 所以你正在写一个套接字?另一端是什么?另一端是否无法读取并且缓冲区已满?
  • @bmorris591 另一端的 Python,我一直在读它。
  • 你的阅读量如何?代码块在哪里?

标签: java sockets buffer send


【解决方案1】:

它变慢了,因为在接收端,在读取下一个值之前,您可能正在使用您发送的值执行长时间任务。所以对方读取数据的速率小于你向对方发送数据的速率。这会不断填充另一端的接收缓冲区并在发送端发送缓冲区。最终,当两个缓冲区都被完全填满时,数据的传输就会停止。

【讨论】:

  • 但只要我继续读取值,i 应该会增加,但速度会很慢。
  • 缓冲区满后,接收端会先清除已满的缓冲区,发送端也会先清除其发送缓冲区。直到有足够的缓冲区可用,TCP停止传输,然后传输再次继续,但非常缓慢..
  • 但这不仅进展非常缓慢,而且根本没有进展。
  • 我告诉过你.. 当两个缓冲区都满了一定时间后,TCP 会停止传输。让您的程序长时间运行,您会看到i 的值再次增加,但非常缓慢,此后又停止。
猜你喜欢
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2015-08-28
  • 2013-05-27
  • 1970-01-01
相关资源
最近更新 更多