我的程序使用 SSLServerSocket
等待传入连接并接收数据。客户端连接到服务器并将一个 10 字节的块序列写入Socket
's OutputStream
。在每个 10 字节块之后OutputStream
ed flush()
,因为块应该尽快到达服务器(注意:这里使用 WIFI)。
然后由服务器读取这些块。使用 OpenJDK 7 在 Ubuntu Linux 上运行服务器可以正常工作。
但是使用 Suns Java 7 在 Windows 上运行服务器会导致以下问题:
我测量了服务器上接收到的块之间的时间。我注意到尽管客户端flush()
在写入块后使用,但有时服务器接收/读取数据为时已晚。
例如:
接收第一个块需要 265 毫秒。接下来的 15 个块有 0ms 到 16ms 的延迟。
之后,下一个块在 172 毫秒后到达。但接下来的 10 个块再次只需要 0ms 到 16ms。
因此,InputStream 似乎首先接收并缓冲了一些字节。然后在某个时间点(例如超过 150 毫秒后)InputStream
's read
- 方法返回一些数据。之后- 方法会read
立即返回一些字节的数据(0ms 到 16ms)。然后它又需要一些时间。
我知道 anInputStream
使用缓冲区和read
-method 阻塞,直到有新字节可用。但似乎read
- 方法并没有尽可能快地返回数据。
客户端始终是 Android 应用程序。但是由于在 Linux 上运行的服务器不会出现问题(块之间总是平均 20 毫秒),所以问题一定是服务器或 JRE。
关于如何解决问题的任何想法?我真的需要客户端发送的块的“流畅”传输,因为 Android 应用程序上的交互应该在服务器上显示为近乎实时的动画。但是这些动画延迟了 265 毫秒。