Java TCP接收窗口大小始终已满

Java TCP接收窗口大小始终已满,java,tcp,Java,Tcp,我有一个设备,它可以非常快地将1440字节有效负载的TCP数据包发送到Windows XP操作系统。我将TcpAckFrequency设置为0,即在收到包后立即发送ACK。 我编写了一个Java应用程序,它在一个线程中读取套接字: in = new BufferedReader(new InputStreamReader(socket.getInputStream())); in.read(charArray, 0, 720); 我的问题是,在收到一些(50-60)数据包后,Windows缓冲

我有一个设备,它可以非常快地将1440字节有效负载的TCP数据包发送到Windows XP操作系统。我将TcpAckFrequency设置为0,即在收到包后立即发送ACK。 我编写了一个Java应用程序,它在一个线程中读取套接字:

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
in.read(charArray, 0, 720);
我的问题是,在收到一些(50-60)数据包后,Windows缓冲区变满,然后发送一个DUP ACK,这会减慢通信速度


我不明白为什么会变满,因为我总是读取缓冲区?

一个可能的解释是Java应用程序无法跟上。换句话说,它不能像设备发送数据那样快速地处理数据。如果这就是问题所在,那么您必须想出一个解决方案,让应用程序更快地处理数据

如果您有多个内核,则可以通过重构Java应用程序,使用一个线程从套接字读取数据,使用另一个线程(或多个线程)进行处理,从而获得更好的思维能力

另一个解决方案可能是简单地分析Java应用程序,看看是否有调优优化的余地


最后,您可以通过为
BufferedReader

使用更大的缓冲区大小来提高吞吐量。问题是,我在收到数据包后绘制了一个图形,由于绘制过程,windows可能没有足够的时间释放缓冲区。现在,我跳过了绘图功能,效果很好。非常感谢。