Можете ли вы отправлять изображения, не останавливая другие данные, проходящие через тот же java.net.socket? - PullRequest
0 голосов
/ 22 декабря 2010

Это ситуация:

Я работаю над проектом, в котором мне нужно время от времени отправлять одно или несколько изображений на сервер и с него, а также множество других типов.данных, представленных с текстом.В настоящее время это делается путем отправки сообщения с надписью «входящее изображение размера x, которое будет использоваться как y» (это, конечно, не «сформулировано»), а затем я вызываю метод, который читает следующий xбайтов через DataInputStream.Сначала я столкнулся с некоторыми проблемами, связанными с задержкой, но я заставил сервер порождать новый поток для отправки сообщения «входящее изображение», а затем дождался флага, который устанавливается, когда клиент отвечает «Я готов».для изображения "сообщение.Теперь он работает определенным образом, но если что-то еще, например, сообщение чата, отправляется во время передачи изображения, это сообщение, предназначенное для BufferedReader, будет прочитано как необработанные байты и использовано как часть изображения.Поэтому мне придется блокировать все исходящие данные (и добавить их в очередь), когда будет отправлено изображение.Но это кажется очень неправильным и раздражающим, так как пользователи приложения не смогут общаться в чате при получении / загрузке большого изображения.

Это то, что мне нужно: Итак, мне либо нужно настроить независимый каналиспользовать для необработанных данных.Который, насколько я понимаю из некоторой переделки, мне придется установить новый сокет поверх нового порта, который кажется ненужным.Другой способ, который я вижу, чтобы решить эту проблему, состоит в том, чтобы как-то использовать тег каждого пакета с битом «это текстовые / необработанные данные», но я понятия не имею, как это сделать с Java?Можете ли вы добавить информацию в заголовок пакета при записи чего-либо в поток (который будет содержать каждый пакет, содержащий эту информацию), а затем прочитать данные пакета на другом конце и действовать соответственно?

Как вы можете видетьУ меня нет большого опыта работы с сетями, и я не использовал Java в течение длительного времени.Это тоже мой первый пост здесь, так что будьте добры.Если что-то было неясно, спросите, а я уточню.Все идеи приветствуются!(Возможно, есть стандартный способ сделать это?)

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

В самом протоколе TCP нет ничего, что могло бы вам помочь.Вы либо открываете новое сокетное соединение (может быть с тем же портом сервера), либо разделяете свои изображения на более мелкие чанки и оборачиваете эти чанки в конверты, говоря, какой это тип сообщения: изображение или чат.А затем восстановить изображение на приемном конце из этих кусков.Но это приведет к потере пропускной способности и добавлению собственных сложностей (например, насколько большой вы сделаете кусок этого изображения?).
Я бы пошел с отдельным соединением двоичных данных.

2 голосов
/ 23 декабря 2010

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

Это может бытьпомочь вам: Как использовать java.net.URLConnection для запуска и обработки HTTP-запросов?

...