TCP сервер отправляет слишком быстро в .NET - PullRequest
1 голос
/ 20 декабря 2010

Я делаю клиент-серверное приложение в .NET, но теперь у меня возникла проблема с тем, что я пытаюсь что-то отправить, клиент читает это, и во время чтения я отправляю что-то еще, так что это делает дерьмо отправленным данные.

Пример:

  1. отправляю тест
  2. Клиент начинает читать
  3. отправляю endtest
  4. Клиент читает test @ $> @ est

Есть ли способ решить это? Сейчас я делаю Thread.Sleep(10) после отправки, но я думаю, что есть лучший способ: P.

P.S. Я использую NetworkStream.Write()/Read(), а не NetworkStream.BeginWrite()/BeginRead(). Какой из этих двух лучше и почему?

Ответы [ 3 ]

1 голос
/ 20 декабря 2010

Проблема может заключаться в том, что вы используете один и тот же сокет для отправки нескольких «вещей» данных.Возможно, вы знаете, что отправили строку, а затем изображение, но TCP не видит отдельные объекты, только один поток байтов.

Вы также не можете знать, сколько вызовов чтения вам нужносделать, чтобы получить ваш «первый» объект данных.Разграничение нескольких объектов выходит за рамки TCP.Дело в том, что эту проблему лучше всего решить, используя один сокет на транзакцию.Создайте сокет, запишите все свои данные в него одним вызовом записи, затем закройте сокет.Попросите клиента прочитать, пока у вас не будут полные данные.Если вам нужно отправить что-то еще, создайте новый сокет.

Я знаю, что это не относится к классу NetworkStream, но я надеюсь, что это поможет.

0 голосов
/ 20 декабря 2010

На вашем месте я бы создал правило при отправке и получении данных. Как сказать, у вас есть начальный символ, например, $, а * это конечный символ. Это поможет вашей клиент-серверной системе узнать, когда читать или когда писать, и в конечном итоге избежать мусора в процессе. так что с точки зрения шагов:

  • Клиент отправляет сообщение $ hello world *
  • Сервер начинает читать, когда видит $ и останавливается после *

опять же, возможно, пример кода того, что вы делаете, может помочь нам точно определить, что вы делаете неправильно.

0 голосов
/ 20 декабря 2010

вы должны изучить использование WCF с nettcpbinding для такого рода вещей, особенно если оба конца (клиент / сервер) находятся в C #.

Раньше у меня были похожие проблемы при написании собственного tcp-кода, но я перешел на wcf, и он значительно проще и стабильнее, поэтому вы можете просто сосредоточиться на написании кода приложения.

...