2015-07-10 4 views
3

В настоящее время я работаю над простым приложением, которое передает скриншоты через сокеты. Я получаю скриншот, инстанцировании и с помощью класса робота следующим образом:Отправлять несколько очень маленьких пакетов или меньше крупных пакетов?

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 выше, чтобы преобразовать BufferedImage в байтовый массив, который затем записывается в выходной разъем потока. Изображение составляет в среднем 500 КБ. Было бы более эффективно разделить этот 500KB на более мелкие сегменты, например, 5KB, или было бы лучше сохранить его в больших кусках, скажем, 30KB. Моя главная цель здесь - скорость и точность доставки. Я также был бы признателен за любые аргументы в пользу того, почему любой из этих способов будет более эффективным в этих терминах, чем другой.

+3

Если вы используете TCP, точность не будет проблемой. Я думаю, что выбор размера пакета, близкого к размеру буфера TCP-стека, был бы идеальным. –

+2

Почему бы вам просто не проверить его с разными размерами? – Manu

+0

@SeanBright и каков размер буфера TCP-стека? Это зависит от системы? – rodit

ответ

2

Размер сетевого пакета ограничен тем, что называется MTU, вы не можете отправить пакет больше, чем mtu. Mtu, как вы можете проверить по ссылке, не так уж и много (я считаю, что 1500 байт является более распространенным MTU для Ethernet). Это для сетевой стороны; на стороне java, определяющей размер сегмента, может зависеть количество передаваемых изображений одновременно (если вы отправляете 100 изображений одновременно, у вас есть 100 сегментов).

Мое предложение состоит в том, чтобы попробовать с размером сегмента чуть меньше MTU (я полагаю, вы используете TCP/IP, поэтому вы должны учитывать размер заголовка TCP и IP) и посмотреть, что произойдет.

Редактировать: некоторые комментарии указывают (правильно), которые формируют точку зрения java, MTU не влияет на то, как данные должны быть разбиты; это справедливо для пакета, большего чем MTU, поскольку уровень TCP/IP разбивает большие куски данных в меньших единицах; но плакат хочет знать, есть ли «лучший» размер буфера; и ответ заключается в том, что по сравнению с MTU нет никакой пользы (для сетевой передачи) при увеличении размера буфера на стороне java

+0

Я ценю помощь. Не могли бы вы дать мне несколько советов по размеру заголовка каждого пакета? – rodit

+1

да, вы можете посмотреть этот ответ http://stackoverflow.com/questions/1846077/size-of-empty-udp-and-tcp-packet сумма заголовков (ethernet + ip + tcp) составляет около 64 байт – Giovanni

+0

@rodit - это около 50-60 байт, а не то, что вы можете изменить. Это не деталь, о которой вы должны беспокоиться, если ваши сообщения не близки к этому размеру. –

1

Отправлять несколько очень маленьких пакетов или меньше крупных пакетов?

Это очень распространенный вопрос в приложениях, в котором QoS играет важную роль. Я думаю, что нет правильного ответа, это только преемственность, которая лучше адаптируется к вашим запросам.

несколько аспектов, которые вы могли бы рассмотреть:

  • Bigger пакеты уменьшает де% накладных расходов по данным.
  • Большие пакеты оказывают большее влияние при возникновении ошибки при получении или отправке данных (поврежденных данных).
  • Меньшие пакеты должны использоваться для приложения, которое обеспечивает лучший ответ пользователю.
  • В некоторых приложениях, где трафик является важным и необходимым для быстрой обработки информации, вместо отправки всего изображения для каждого кадра части изображения должны меняться с использованием соответствующих протоколов.
+2

Это на самом деле довольно хороший ответ. Зачем кому-то его понижать? Во всяком случае, я собираюсь выдвинуть его, так что там :) –

Смежные вопросы