Как сделать так, чтобы сокет не зависал при чтении тектовых данных?

Я разбираюсь с сокетами и столкнулся с проблемой при использовании класса NetworkStream.

При бинарной сериализации всё работает.

Клиент:

  using (var stream = new NetworkStream(socket))
  {
    var bf = new BinaryFormatter();
    bf.Serialize(stream, some_request);
  }

Сервер:

    using (var stream = new NetworkStream(client_socket))
    {
      var bf = new BinaryFormatter();
      DoSomething(bf.Deserialize(stream));
    }

Но стоит мне заменить BinaryFormatter на XmlSerializer, сервер виснет при вызове метода Deserialize.

При этом похожая проблема наблюдается при использовании простых текстовых потоков ввода-вывода.

Вот такая конструкция на сервере при чтении строки, переданной от клиента:

    using (var stream = new NetworkStream(client_socket))
    {
      using (var sr = new StreamReader(stream, Encoding.Unicode))
        DoSomething(sr.ReadToEnd());
    }

гарантированно виснет. Но можно заставить это работать, если на клиенте в конце передаваемой строки вставить перевод строки, а на сервере читать данные вот так:

    while (stream.DataAvailable)
      DoSomething(sr.ReadLine());

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


Ответы (0 шт):