Как сделать так, чтобы сокет не зависал при чтении тектовых данных?
Я разбираюсь с сокетами и столкнулся с проблемой при использовании класса 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 вовремя не отрабатывает признак завершения потока, а текстовые потоки ждут его и не могут дождаться. Но как это корректно разрулить?