0

我的程序使用 SSLServerSocket等待传入连接并接收数据。客户端连接到服务器并将一个 10 字节的块序列写入Socket's OutputStream。在每个 10 字节块之后OutputStreamed 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 毫秒。

4

2 回答 2

2

为什么您认为问题出在 InputStream 读取方法上?您是否设置了数据包嗅探器来实际观察网络流量?Java没有做缓冲,网络堆栈是。您可能会或可能无法通过调整某些套接字设置来影响它。

于 2012-10-05T15:27:05.547 回答
2

InputStream 缓冲数据

不,它没有。没有任何 InputStream 缓冲,除非您使用 BufferedInputStream。您的发送正在由内核中的 TCP Nagle 算法合并。在发送方调用 Socket.setTcpNoDelay(true)。

您应该知道,通过 SSL 发送 10 字节块的效率极低。SSL 本身有大约 44 个字节的记录开销,而 TCP 还有 20 个字节,因此您的数据爆炸量接近 4 倍。如果可能,请使用纯文本。

于 2012-10-05T22:54:01.903 回答