Передача нескольких изображений через TCP / сокет - PullRequest
0 голосов
/ 11 августа 2011

Я пытаюсь создать приложение на Java, чтобы у меня была сетка изображений. Каждое изображение должно быть загружено с удаленного сервера через TCP-соединение (я).

Мой вопрос: какой лучший способ сделать это? Использовать один сокет TCP и запрашивать все изображения через него или открывать новый сокет для каждого запроса изображения?

----- ОБНОВЛЕНИЕ -----

Спасибо всем за ваши ответы.

Я обновляю пост, чтобы написать дополнительную информацию, которая отвечает на некоторые ваши вопросы.

  • Система клиент / сервер находится в локальной (домашней) сети и не будет Передача данных через Интернет, поэтому пропускная способность соединения не проблема.
  • Также сетка будет содержать миниатюры изображений, изображения I будет загружаться по требованию при использовании двойного щелчка на миниатюре в отдельном сокете.
  • Я пишу код с клиента и сервера, оба написаны на Java.
  • у нас есть один клиент, который может подключаться к небольшому количеству серверов, но только один за раз без параллельных подключений к различным серверам.

Что я думаю, если использовать один сокет, я должен разделить размер изображения, имя изображения, поэтому я должен для каждого изображения отправить строку с именем и длинную строку для размера. Бросьте один сокет, лучше запросить все изображения вместе в начале соединения, а затем отправить все изображения последовательно один к одному, или бросить один сокет, отправить запрос изображения, получить ответ изображения, после запроса второго изображения. и получите второй ответ.

Если я использую несколько сокетов, по одному сокету для каждого запроса изображения, я хочу иметь максимальное количество открытых сокетов, могу ли я использовать пул потоков и использовать один исполняемый модуль для управления передачей одного изображения в один сокет?

Еще раз спасибо.

Ответы [ 4 ]

0 голосов
/ 11 августа 2011

Я просто хотел бы отметить, что в тех ответах, которые решительно утверждают, что одно соединение более эффективно или быстрее, чем несколько соединений ... или и наоборот ... не хватает пары важныхпроблемы:

  • Оптимальное решение зависит от ряда факторов, таких как:

    • насколько большие / маленькие изображения (в байтах)для передачи),

    • пропускная способность сети и задержка для маршрута между клиентом и сервером (которая может измениться)

    • перегрузка сети

    • загрузка / перегрузка сервера

  • Вы также должны решить, оптимизируете ли вы для одного клиента или для нескольких клиентовиспользуя то же приложение;т. е. «наплевать» ли вы на влияние вашего приложения на других пользователей сервиса.


Мне кажется, что вы, вероятно, получите лучшую пропускную способность с несколькимисоединения вместо одного.Но будет момент, когда открытие большего количества соединений фактически уменьшит пропускную способность из-за сочетания перегрузки сети и различных проблем нагрузки на стороне клиента / сервера.Сделать это как можно быстрее в любых условиях очень, очень сложно.

0 голосов
/ 11 августа 2011

Использование нескольких сокетов позволит параллельно выполнять несколько передач, если позволяет пропускная способность и емкость сервера.

Еще одним недостатком использования одного сокета для всех передач является то, что вы должны найти способ для клиента определить конец каждого файла. Использование сокета для файла упрощает это, поскольку удаленный сервер может просто закрыть соединение после каждого файла.

Я не могу думать о каком-либо конкретном преимуществе использования одного сокета, кроме, возможно, незначительного уменьшения времени установки для сокетов TCP.

Так что в итоге я бы выбрал сокет для каждого файла.

Я бы также отметил, что HTTP использует комбинацию обоих - параллельных соединений и нескольких загрузок на сокет. Однако последняя оптимизация в основном полезна при передаче большого количества небольших файлов, но вряд ли она будет полезна при передаче файлов изображений размером более 100 тыс.

0 голосов
/ 11 августа 2011

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

0 голосов
/ 11 августа 2011

Если вы отвечаете как за сервер, так и за клиента, нет причин не использовать одно соединение для загрузки нескольких (всех) изображений одновременно. Это, конечно, будет более эффективным.

...