Java 如何通过套接字加速数据传输?

Java 如何通过套接字加速数据传输?,java,android,sockets,Java,Android,Sockets,目前,我在服务器端和客户端都使用此代码。客户端是安卓设备 BufferedOutputStream os = new BufferedOutputStream(socket.getOutputStream(),10000000); BufferedInputStream sin = new BufferedInputStream(socket.getInputStream(),10000000); os.write("10000000\n".getBytes()); os.flush(); fo

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

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();
BufferedOutputStream os=新的BufferedOutputStream(socket.getOutputStream(),10000000);
BufferedInputStream sin=新的BufferedInputStream(socket.getInputStream(),10000000);
write(“10000000\n”.getBytes());
os.flush();

对于(int i=0;i您可以压缩数据传输,这将节省大量内存,而且传输压缩数据流更便宜…因此,您需要在客户端实现压缩逻辑,在服务器端实现解压缩逻辑,请参阅GZIPInputStream…并尝试减少缓冲区大小对于移动设备来说是巨大的…

您可以压缩在数据传输过程中,它将节省大量内存,而且传输压缩数据流更便宜…因此,您需要在客户端实现压缩逻辑,在服务器端实现解压缩逻辑,请参阅GZIPInputStream…并尝试减少缓冲区大小,这对于移动设备来说是巨大的…

首先,正如一位评论员已经指出的那样,使用大得惊人的缓冲区可能会适得其反。一旦流缓冲区大于网络数据包的大小,应用程序端缓冲就会失效。(大缓冲区中的数据在进入网络之前需要由TCP/IP堆栈拆分数据包大小的块。)事实上,如果应用程序端缓冲区非常大,您可能会发现数据在缓冲区中停留很长时间,等待缓冲区填满……而网络实际上处于空闲状态

(缓冲…
读卡器、写卡器和流的主要设计目的是避免大量传输少量数据的系统调用。超过10K左右,缓冲对性能没有多大帮助。)

现在的另一件事是,在许多操作系统环境中,网络吞吐量实际上受到虚拟化和默认网络堆栈调整参数的限制。要获得更好的吞吐量,可能需要在操作系统级别进行调整

最后,如果您的网络路径所经过的网络路径拥挤、具有较高的端到端延迟或链路数据速率受限,则无论您如何调整,都不可能获得快速数据传输


(压缩可能会有所帮助……如果您能够负担两端的CPU开销……但有些数据链路已经透明地进行压缩了。)

首先,正如一位评论者已经指出的,使用巨大的缓冲区可能会适得其反。一旦流缓冲区大于网络数据包的大小,应用程序端缓冲将失去其有效性。(你的“大”缓冲区中的数据)缓冲区在进入网络之前需要由TCP/IP堆栈拆分数据包大小的块。)事实上,如果应用程序端缓冲区非常大,您可能会发现数据在缓冲区中停留很长时间,等待缓冲区填满……而网络实际上处于空闲状态

(缓冲…读卡器、写卡器和流的主要设计目的是避免大量传输少量数据的系统调用。超过10K左右,缓冲对性能没有多大帮助。)

现在的另一件事是,在许多操作系统环境中,网络吞吐量实际上受到虚拟化和默认网络堆栈调整参数的限制。要获得更好的吞吐量,可能需要在操作系统级别进行调整

最后,如果您的网络路径所经过的网络路径拥挤、具有较高的端到端延迟或链路数据速率受限,则无论您如何调整,都不可能获得快速数据传输


(压缩可能会有所帮助……如果您能够负担两端的CPU开销……但有些数据链路已经透明地进行压缩了。)

使用如此大的缓冲区可能会适得其反,因为写入延迟太多。几kB的缓冲区大小通常就足够了。但这并不能解释速度差异。服务器和客户端是如何连接的?是否存在不对称连接?它们是通过热点连接上的TCP套接字连接的,链路速度为150mbps。Th问题不在于数据传输,而在于缓冲。您的android客户端可能在内存中保留巨大的缓冲区方面存在问题,因此会进行一些交换。好的,我将使用较小的缓冲区(例如100kB)再次检查。请稍等。另外,将写入拆分为两个语句,而不是字符串串联。使用如此大的缓冲区大小可能会适得其反,因为写入延迟太多。几kB的缓冲区大小通常就足够了。但这并不能解释速度差异。服务器和客户端是如何连接的?是否存在不对称连接?它们是通过热点连接上的TCP套接字连接的,链接速度为150mbps。但问题不在于数据传输,但使用缓冲。您的android客户端可能无法将巨大的缓冲区保留在内存中,因此会进行一些交换。好的,我将使用较小的缓冲区大小(例如100kB)再次检查。请稍等。另外,将写操作拆分为两条语句,而不是字符串连接。
for (int i =0;i<10000000;i++){
     os.write((sampleRead[i]+" ").getBytes());
}