2012-02-18 3 views
1

У меня есть клиентская и серверная программа. Клиент отправляет файл на сервер, сначала преобразовывая файл в байты, а затем отправляя его на сервер. Затем сервер восстановит файл, используя полученные байты. У меня проблема с программой сервера. Иногда байты, которые он получает, являются неполными.Как правильно отправлять и получать байты/файлы с помощью сокетов?

Теперь я уже просматривал через Интернет и выяснил, что это распространенная проблема среди начинающих программистов, таких как я. Я пробовал различные решения, которые я нашел, но ничего не получилось. (Я работал над этим уже около 2 дней)

Мне было интересно, как правильно отправлять и получать файлы/байты между двумя программами в локальной сети? (Один из них является сервером, а другой - клиентом, хотя, конечно, может быть более одной клиентской программы, которая будет подключаться к серверной программе)

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

Дополнительная информация: Я на самом деле основываю свой код на этом форуме темы: DANIWEB. Прочитав поток, программа отлично поработала и даже сумела отправить видеофайл 400 МБ +. В моем случае я отправляю только небольшие изображения и файлы документов размером менее 10 МБ, и моя серверная программа чаще всего терпит неудачу.

Я уже спросил question, связанный с этой проблемой, попробовал предоставленный мне ответ, но моя программа все еще не работает. Я также нашел что-то в MSDN, что немного похоже на ответ, данный мне в моем вопросе. Пробовал также, но моя серверная программа все еще не работает.

ответ

1

Трудно ответить, я настоятельно рекомендую вам систему Socket Framework на платформе .net. Это сэкономит вам много времени на разработку самостоятельно. SuperSocket

+0

спасибо. Надеюсь, я с легкостью узнаю, как это использовать. – Xel

+0

Очень плохое документирование для этого проекта. Плохие примеры. – alerya

2

Вы говорите, «неполными» - это обычно указывает на одну из двух вещей:

  • отправитель может иметь «Нэйгл» включен, и последние несколько байтов еще может быть проведена в их конце (OS/NIC), пока не появится достаточно большой пакет. Значение: даже если они называются Send/Write/etc - он все еще не покидает клиентскую машину. Это не неожиданно. Они могут заставить его отправить, закрыв сокет (или, по крайней мере, отправить-выключить), или отключив nagle (установите NoDelay = true) и возьмите на себя ответственность за чрезмерное фрагментирование (BufferedStream может быть полезен для этого)
  • приемник не всегда получает целые кадры; в любом Read/BeginRead/ReceiveAsync/etc все, что вам гарантировано, это «некоторые байты» или «EOF». Таким образом, вы должны продолжать читать, пока у вас нет рамки для соревнований. Вопрос в том, каков кадр, определенный вашим протоколом? Общие подходы включают длину или префикс (или длину в заголовке) или специальную последовательность рамочной оконечности

Невозможно интерпретировать больше без кода; однако, как отмечено в другом ответе, это может помочь разгрузить детали сокетов в библиотеку. Как бы то ни было, я сейчас работаю над тем, что намерен вскоре выпустить в OSS.

+0

Если в отправителе осталось еще несколько байтов, не будет flush() заставить его перейти на сервер? btw, код приложения, о котором я говорю в этом вопросе, можно найти здесь: http://stackoverflow.com/questions/9317452/the-bytes-my-server-program-receives-is-incomplete- почему-im-using-c-sharp-net # comment11754870_9317452 , пожалуйста, взгляните на него и посмотрите, что случилось. – Xel

+0

@Xel Flush не работает в потоках TCP. Но я не думаю, что nagle должен откладывать доставку более чем на несколько секунд, и даже это, только если пакеты потеряны. Обычно для критических приложений только для игр/латентности необходимо отключить нагл. – CodesInChaos

+0

@Xel CodeInChaos абсолютно прав, что Flush() ничего не делает здесь, но я должен добавить, что ... –

Смежные вопросы