Каков наилучший способ передачи данных по сети с подтверждением..Сеть - PullRequest
1 голос
/ 03 февраля 2012

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

Моя цель - отправить группы структур и дождаться подтверждения от сервера, что они были получены и правильно сохранены на его стороне.

Моя идея состояла в том, чтобы создать простой код.

Клиентская сторона:

  1. подключиться к серверу;
  2. подготовить список структур;
  3. в цикле отправляет их в виде байтовых массивов в сеть с помощью метода Stream.Write (...). Тогда Flush ();
  4. дождитесь ответа сервера о том, сколько данных он может сохранить.
  5. повторить все с шага 2.

Серверная сторона:

  1. принять клиентское соединение;
  2. принимать данные до конца (Stream.Read () не хочет определять, что конец данных может быть из-за того, что соединение еще живо);
  3. сохранить все данные на диск;
  4. отправить ответ о количестве сохраненных данных клиенту, используя то же клиентское соединение, которое использовалось для получения данных от клиента.

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

как сделать все, что я хочу, райт?

Ответы [ 4 ]

2 голосов
/ 03 февраля 2012

Мне кажется, что проблема заключается в том, что Flush() ничего не делает - что фактически является документированным поведением для NetworkStream.Flush():

Метод Flush реализует метод Stream.Flush;однако, поскольку NetworkStream не буферизован, он не влияет на сетевые потоки.Вызов метода Flush не вызывает исключения.

Чтобы обойти это;Я бы настроил ваш сокет для отправки немедленно (установите NoDelay в true), а затем, чтобы избежать проблем с размером пакета, я бы обернул NetworkStream в BufferedStream (отмечая, чтоодин буферизованный поток подходит только для или чтения или записи, но не для обоих одновременно).Затем:

  • запись, запись, запись и т. Д. В BufferedStream
    • всякий раз, когда он заполнен, он будет записывать в сеть, отправляя немедленно
  • очистить BufferedStream
    • , который будет писать в сеть, отправляя немедленно

, это позволит отправлять конец вашего сообщения беззастрять в буфере вывода и не требуя закрытия потока.

0 голосов
/ 28 февраля 2012

Я использовал .Net Remoting для выполнения задач передачи данных. Итак, проблема решена (если других больше не появится :))

0 голосов
/ 03 февраля 2012

Почему бы вам не использовать MSMQ?http://msdn.microsoft.com/en-us/library/ms978430.aspx

0 голосов
/ 03 февраля 2012

Редактировать : OP добавил комментарий при условии, что ему нужно использовать pre .NET 3.0.

При условии, что оба конца соединения являются .NET, WCF должен иметь все инструменты, которые вам когда-либо понадобятся для управления передачей данных.

Более конкретно, взгляните на

Кроме того, если вам когда-либо понадобится переключиться на асинхронную передачу данных, вы можете перейти на перенос в очередь, такой как MSMQ .

...