目前,我正在服务器端和客户端使用此代码。客户端是一个android设备。
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());
}缓冲花费了大部分时间,而在150 most热点连接上,实际传输仅需6-7秒。问题可能是什么,如何解决?
发布于 2018-11-07 05:39:21
首先,正如一位评论者已经指出的那样,使用巨大的缓冲区可能会适得其反。一旦您的流缓冲区大于网络数据包的大小,应用程序端缓冲就失去了其有效性。(在您的“大”缓冲区中的数据在进入网络之前,需要由TCP/IP堆栈拆分数据包大小的块。)实际上,如果应用程序端缓冲区非常大,您可能会发现数据在缓冲区中停留了很长时间,等待缓冲区填充.而网络实际上是空闲的。
( Buffered...阅读器、作者和流的设计主要是为了避免大量传输少量数据的系统。在10K以上,缓冲的性能没有多大帮助。)
现在的另一件事是,在许多操作系统环境中,网络吞吐量实际上受到虚拟化和默认网络堆栈调优参数的限制。为了获得更好的吞吐量,您可能需要在OS级别进行调优。
最后,如果您的网络路径正在通过拥挤的网络路径,具有较高的端到端延迟或数据速率受限的链接,那么无论您如何调优,都不太可能得到快速的数据传输。
(压缩可能会有帮助.如果你能负担得起两端的CPU开销..。但是一些数据链接已经透明地压缩了。)
发布于 2018-11-07 05:25:35
您可以压缩数据传输,它将节省大量的内存,最好是传输一个压缩数据流更便宜.为此,您需要在客户端实现压缩逻辑,在服务器端实现解压缩逻辑,请参阅GZIPInputStream.试着缩小缓冲区大小对于移动设备来说是巨大的。
https://stackoverflow.com/questions/53183634
复制相似问题