为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

四季花海 2022-01-06 17:32:59
目前我在服务器端和客户端都使用此代码。客户端是安卓设备。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 开销......但一些数据链接已经透明地进行了压缩。)


查看完整回答
反对 回复 2022-01-06
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

您可以压缩数据传输,它会节省大量内存,并且传输压缩数据流更便宜......为此,您需要在客户端实现压缩逻辑并在服务器端实现解压逻辑,请参阅GZIPInputStream.. . 并尝试减少移动设备的缓冲区大小是巨大的......


查看完整回答
反对 回复 2022-01-06
  • 2 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信