ServerSocket как получить несколько файлов - PullRequest
0 голосов
/ 29 мая 2019

У меня есть учебный проект. Я, мой учитель, не хочу рассказывать мне, как решить проблему с получением нескольких файлов. Я знаю, что мне нужно использовать функцию getInputStream (), но я не знаю, как разделить эти файлы в этом объекте inputStream. Мне нужно разделить этот inputStream, потому что мне нужно сохранить каждый файл в папке.

Спасибо за вашу помощь и за объяснение мне этой проблемы.

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Ответ в том, что вам, вероятно, нужен протокол передачи, такой как HTTP или FTP.Но если вы не хотите чего-то такого высокого уровня, вы можете использовать tar, а затем распаковать ваши файлы, как это делали люди на unix в те времена.Tar по-прежнему в основном протокол передачи, но, возможно, не такой тяжелый, как HTTP или FTP

0 голосов
/ 29 мая 2019

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

Допустим, у вас есть приложение чата, в котором всего 2 пользователя (один сервер клиенту). Каждый пользователь может отправить сообщение любой длины. Допустим, пользователь1 хочет отправить пользователю2 следующие сообщения (каждая строка - одно сообщение)

Hello User
How are you doing today?

Если вы отправите каждое из этих необработанных сообщений через сокет, вы, скорее всего, получите Hello UserHow are you doing today?. Теперь, как вы узнаете, где одно сообщение началось, а другое остановилось?

Простым решением является отправка чего-либо перед каждым сообщением с указанием длины символов в следующем сообщении, поэтому ваше сообщение может быть

11Hello User24How are you doing today?

Таким образом, конечный пользователь знает, что я прочитал int, который говорит мне <length>, а затем прочитал <length> символов, чтобы получить полное сообщение.


Теперь это довольно простой пример, а не супер. Давайте посмотрим на простой формат пакета, который я видел в видеоигре:

Field Name   Field Type   Notes
Length       VarInt       Length of packet data + length of the packet ID
Packet ID    VarInt 
Data         Byte Array   Depends on the connection state and packet ID, see the sections below

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


В вашем случае вам, вероятно, понадобится что-то похожее, мета-данные о байтах, которые вы отправляете. EG: длина файла, имя файла.

Я бы начал с рассмотрения класса DataInputStream для легкого чтения примитивных типов данных.

...