如何加快通过套接字的数据传输?

目前我在服务器端和客户端都使用此代码。客户端是安卓设备。


BufferedOutputStream os = new BufferedOutputStream(socket.getOutputStream(),10000000);

BufferedInputStream sin = new BufferedInputStream(socket.getInputStream(),10000000);

os.write("10000000\n".getBytes());

os.flush();

for (int i =0;i<10000000;i++){

    os.write((sampleRead[i]+" ").getBytes());

    }

os.flush();

问题是这段代码需要大约 80 秒才能将数据从 android 客户端传输到服务器,而将数据从服务器传输回客户端只需要 8 秒。两边的代码相同,缓冲区也相同。我也尝试过不同的缓冲区大小,但问题出在这个段上


for (int i =0;i<10000000;i++){

     os.write((sampleRead[i]+" ").getBytes());

}

缓冲需要大部分时间,而在 150mbps 热点连接上实际传输只需要大约 6-7 秒。可能是什么问题以及如何解决它?


四季花海
浏览 148回答 2
2回答

繁花不似锦

首先,正如评论者已经指出的那样,使用巨大的缓冲区可能会适得其反。一旦您的流缓冲区大于网络数据包的大小,应用程序端缓冲就会失去其有效性。(“大”缓冲区中的数据在进入网络之前需要由 TCP/IP 堆栈拆分为数据包大小的块。)确实,如果应用程序端缓冲区非常大,您可能会发现您的数据被长时间停留在缓冲区中等待缓冲区填满......而网络实际上处于空闲状态。(Buffered...读取器、写入器和流的主要设计目的是避免大量传输少量数据的系统调用。超过 10K 左右,缓冲对性能没有太大帮助。)现在的另一件事是,在许多操作系统环境中,网络吞吐量实际上受到虚拟化和默认网络堆栈调整参数的限制。为了获得更好的吞吐量,您可能需要在操作系统级别进行调整。最后,如果您的网络路径通过拥塞、端到端延迟高或链接数据速率受限的网络路径,那么无论您如何调整,都不太可能获得快速数据传输。(压缩可能会有所帮助......如果你能负担得起两端的 CPU 开销......但一些数据链接已经透明地进行了压缩。)

Smart猫小萌

您可以压缩数据传输,它会节省大量内存,并且传输压缩数据流更便宜......为此,您需要在客户端实现压缩逻辑并在服务器端实现解压逻辑,请参阅GZIPInputStream.. . 并尝试减少移动设备的缓冲区大小是巨大的......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java