Похоже, ваш инструктор хочет, чтобы вы создали протокол. Причина, по которой вам понадобится протокол, заключается в том, что если вы отправляете несколько файлов через один сокет, вы не будете знать, когда один файл останавливается, а другой начинается. Чтобы упростить задачу, я буду использовать простое приложение чата в качестве примера, но то же самое будет применяться к файлам.
Допустим, у вас есть приложение чата, в котором всего 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 для легкого чтения примитивных типов данных.