Приложение для передачи файлов - PullRequest
1 голос
/ 25 января 2012

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

, например

file name: myfile.txt
data in the file is : hello how are you.


server create the file name myfile.txthellow how  

Как можно избежать этого, поскольку я не знаю, каков размер имени файла при размере сервера. Спасибо

Ответы [ 3 ]

1 голос
/ 25 января 2012

Вы должны отправить длину имени файла на сервер.Есть два способа сделать это:

  • Явно отправить длину имени файла, а затем имя файла на сервер.
  • Неявно отправить длину путем завершения имени файла специальным символомкак правило, nul ('\ 0' или 0 байт)

Кроме того, имейте в виду, что один вызов recv может считывать данные, отправленные с нескольких send s на другой стороне: Вот какTCP работает (TCP является потоковым протоколом): не предполагайте, что данные, отправленные в одной команде send, будут поступать в одной recv.Одна recv может получить данные от одной или нескольких команд send, а данные от одной или нескольких команд send могут быть получены в одной команде recv.(И вы тоже можете получить "половину send").

0 голосов
/ 25 января 2012

Вы можете определить собственный протокол с двумя типами сообщений: один тип для имени файла и другой для данных. каждое сообщение состоит из первого байта, указывающего его тип (заголовок), и оставшихся байтов, содержащих либо имя файла, либо данные (тело).

0 голосов
/ 25 января 2012

Существует несколько вариантов:

  1. Отправка специального символа после имени файла (например, NUL или \n).
  2. Префикс имени файла с его длиной вбайты.

На принимающей стороне и имя файла, и данные поступят в виде одного потока байтов.Однако на сервере теперь достаточно информации, чтобы выяснить, где заканчивается имя файла и начинаются данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...