Java 发送多个非常小的数据包还是更少的大数据包?
我目前正在开发一个简单的应用程序,可以跨套接字传输屏幕截图。我通过实例化并使用Robot类获得屏幕截图,如下所示:Java 发送多个非常小的数据包还是更少的大数据包?,java,sockets,network-programming,Java,Sockets,Network Programming,我目前正在开发一个简单的应用程序,可以跨套接字传输屏幕截图。我通过实例化并使用Robot类获得屏幕截图,如下所示: private Robot robot; public Robot getRobot(){ if(robot == null){ try{ robot = new Robot(); }catch(Exception e){} } return robot; } public BufferedImage
private Robot robot;
public Robot getRobot(){
if(robot == null){
try{
robot = new Robot();
}catch(Exception e){}
}
return robot;
}
public BufferedImage screenshot(){
return getRobot().createScreenCapture(getScreenRectangle());
}
public byte[] getBytes(BufferedImage image){
byte[] data = null;
try{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "PNG", baos);
data = baos.toByteArray();
baos.close();
}catch(IOException e){}
return data;
}
然后,我使用上面的
getBytes
方法将buffereImage
转换为字节数组,然后将其写入套接字输出流。图像平均为500KB。将这500KB拆分成更小的段(比如5KB)会更有效吗?还是将其保留在更大的块(比如30KB)中会更好。我这里的主要目标是交货的速度和准确性。我也很感激任何一种方法在这些方面比另一种更有效的原因。网络数据包大小受所谓的限制,您不能发送比mtu大的数据包。从链接中可以看出,mtu没有那么大(我相信1500字节是以太网中更常见的mtu)。这是为了网络方面;在java端,决定段大小可能取决于并发传输的图像数量(如果并发发送100个图像,则分配了100个段)
我的建议是尝试一个段大小略小于MTU(我猜你正在使用TCP/IP,所以你必须考虑TCP和IP头大小),看看会发生什么。
编辑:一些评论(正确地)指出,从java角度来看,MTU不会影响数据的分块方式;这对于比MTU大的数据包是正确的,因为TCP/IP层以较小的单位分解较大的数据块;但海报想知道是否存在“最佳”缓冲区大小;响应是,在MTU上,增加java端的缓冲区大小没有任何好处(对于网络传输) 发送多个非常小的数据包还是更少的大数据包 这是应用程序中一个非常常见的问题,QoS起着重要作用。我认为没有一个正确的答案,只有一个更适合你的要求的实现 您可以考虑以下几个方面:- 较大的数据包可减少数据开销的de%
- 当接收或发送数据(损坏的数据)时出错时,较大的数据包会产生较大的影响
- 较小的数据包应用于对用户提供更好响应的应用程序
- 在某些应用中,流量对于快速处理信息非常重要和必要,而不是为每个帧发送整个图像,应使用适当的协议发送图像的不同部分
- 发送数据的系统调用更少
- 减少开销,因为您发送的TCP数据包和冗余头更少
- 碎片化是网络堆栈较低级别的责任,而不是您的应用程序
- 生成的代码将简单得多