【问题标题】:Can a java socket make multiple back to back writes without overwhelming the receiving socket?java 套接字可以在不压倒接收套接字的情况下进行多次背靠背写入吗?
【发布时间】:2017-01-30 15:33:42
【问题描述】:

我对套接字编程很陌生。我注意到BufferedReader.readln() 会阻塞,直到另一端有可读取的内容,但PrintWriter.println() 只是像忍者星一样抛出数据。

我在互联网上看到的大多数套接字示例都是简单的读写程序。

如果我的程序让服务器多次调用 println() 以发送不同的字符串,并且客户端套接字需要读取每一行并处理字符串在每次读取之间,是服务器有可能用数据压倒客户端吗?一些数据最终会丢失吗?

是否必须在我的程序中设置“响应”类型的逻辑,即服务器发送数据并等待客户端“继续”然后继续?

这是否也因所使用的 InputStream/OutputStream 实现而不同(如数据或对象输入/输出流)?

我不知道这是否会有所不同,但这些是我在 Android 应用程序中运行的程序。

【问题讨论】:

    标签: java android sockets


    【解决方案1】:

    这一切都由 TCP 规范为您解决。解释起来真的很复杂,但是 TCP 中有一些算法可以处理发送和接收窗口大小、指数退避和恢复、接收数据的确认等。除非你正在处理像实时视频流这样的延迟问题,否则你不必担心。

    【讨论】:

    • 所以 TCP 是一个流套接字——它按顺序发送一系列字节。发送窗口是发送方正在发送但尚未收到确认的一组字节。还有一个接收窗口,这是接收器期望看到所有传入数据都在该范围内的字节集(因为数据可能出现乱序并且接收器修复了顺序)。但这都是您无需担心的,因为它是内置的。
    【解决方案2】:

    没有。如果发送方超过接收方,它将在阻塞模式下阻塞,或者在非阻塞模式下获得零长度写入。这发生在 TCP 中,而不是 Java 中。

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 2017-09-11
      • 2016-10-27
      • 2012-03-03
      • 2019-06-05
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多