目前我在服务器端和客户端都使用此代码。客户端是安卓设备。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 秒。可能是什么问题以及如何解决它?
2 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
首先,正如评论者已经指出的那样,使用巨大的缓冲区可能会适得其反。一旦您的流缓冲区大于网络数据包的大小,应用程序端缓冲就会失去其有效性。(“大”缓冲区中的数据在进入网络之前需要由 TCP/IP 堆栈拆分为数据包大小的块。)确实,如果应用程序端缓冲区非常大,您可能会发现您的数据被长时间停留在缓冲区中等待缓冲区填满......而网络实际上处于空闲状态。
(Buffered...
读取器、写入器和流的主要设计目的是避免大量传输少量数据的系统调用。超过 10K 左右,缓冲对性能没有太大帮助。)
现在的另一件事是,在许多操作系统环境中,网络吞吐量实际上受到虚拟化和默认网络堆栈调整参数的限制。为了获得更好的吞吐量,您可能需要在操作系统级别进行调整。
最后,如果您的网络路径通过拥塞、端到端延迟高或链接数据速率受限的网络路径,那么无论您如何调整,都不太可能获得快速数据传输。
(压缩可能会有所帮助......如果你能负担得起两端的 CPU 开销......但一些数据链接已经透明地进行了压缩。)
Smart猫小萌
TA贡献1911条经验 获得超7个赞
您可以压缩数据传输,它会节省大量内存,并且传输压缩数据流更便宜......为此,您需要在客户端实现压缩逻辑并在服务器端实现解压逻辑,请参阅GZIPInputStream.. . 并尝试减少移动设备的缓冲区大小是巨大的......
添加回答
举报
0/150
提交
取消