2016-05-07 9 views
1

Извините, если моя терминология неверна с этим вопросом, но нести меня. Я знаю, чего хочу достичь, просто не знаю, какие имена принадлежат классам/функциям и т. Д.отправка обоих файлов и строк через tcp в vb.net

Мне нужно сделать клиент/серверное приложение с помощью tcplistener и tcpclient, что позволит мне отправлять как строки, так и файлы ... думаю.

Так что, говоря языком непрофессионала, я хочу создать серверное приложение, которое будет прослушивать подключения от клиента на конкретном порту. Клиенты будут, по существу, подключаться к серверу и сказать «эй, я клиент 172.16.10.12. Я собираюсь отправить вам файл с именем test.txt размером 2330 тыс. Хэш хэш-файла MD5 - это ххххххххххх».

Как только это сообщение произошло, я хочу, чтобы клиент отправил файл test.txt на сервер; сервер, сохраняющий файл в соответствующем месте, прежде чем генерировать хеш-файл MD5 файла и сравнив его с MD5 и размером файла, предложенным клиентом, прежде чем, наконец, сообщит клиенту «Хорошо» или «Успех».

Если размер файла или MD5 отличается, это будет «Fail».

Я не прошу кого-либо сделать это для меня, но для кого-то, кто подталкивает меня в правильном направлении. Все учебники/примеры, которые, как мне кажется, находятся здесь, или youtube и т. Д., Похоже, сосредоточены на файлах или строках. Кажется, я не могу найти тот, который будет обслуживать и то, и другое, что мне кажется нужным, хотя я могу ошибаться.

Я надеюсь, что все имеет смысл! Огромное спасибо за любую помощь в этом. Это первый раз, когда я играл с функциями TCP, всегда используя FTP раньше из-за воспринимаемой легкости.

+0

Вы можете увидеть [** мой ответ на этот вопрос **] (http://stackoverflow.com/a/35240061/3740093), который поможет вам осуществить правильный способ дифференцировать данные (_» пакеты "_), которые вы отправляете. –

+0

Что касается разделения его на куски (как упоминалось в моем комментарии к запросу пользователя3815486), вам сначала нужно отправить серверу точное количество байтов, которое есть в этом файле, тогда вы начнете отправлять ему 8192 байтовых фрагментов, пока не увидите прочитайте весь файл. ** Сервер ** должен будет делать это каждый раз, когда он получает пакет файловой части: '8192 байта -> Запись в файл -> Проверьте, получил ли мы весь файл (совпадение с тем, что отправил клиент)'. –

ответ

1

Я считаю, что для этого небольшого файла вы можете преобразовать файл в байты на стороне клиента, а затем отправить его по tcp в виде массива байтов, и серверное приложение перестроит файл из массива байтов с помощью File.WriteAllbytes.

Save byte array to file

Вот как получить байт из файла. PS Я не очень опытный, просто отправляю что-то .. Reliable way to convert a file to a byte[]

Это должно работать из коробки для отправки массива байтов как tcp. Я никогда не пробовал то, что я написал, но он должен работать.

try 
     { 
      string Hostname = "127.0.0.1"; 
      TcpClient Client = new TcpClient(Hostname, 10000); 
      byte[] packet = new byte[] { 0x17, 0x03, 0x01, 0x4c }; 
      Client.Client.Send(packet); 
     } 
     catch (SocketException e) 
     { 
     } 
+0

Что произойдет, если я преобразую большой файл в байты? – John

+0

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

+0

Я нашел это, он должен хорошо работать для вас. http://codetechnic.blogspot.cz/2009/02/sending-large-files-over-tcpip.html –