Вопрос

Используя StreamWriter написать в NetworkStream, и StreamReader чтобы прочитать ответ.Приложение отправляет команды и считывает ответы на сервер новостей.

Упрощенный код (без обработки ошибок и т. д.):

tcpClient = new TcpClient();
tcpClient.Connect(Name, Port);

networkStream = tcpClient.GetStream();
serverReader = new StreamReader(networkStream, Encoding.Default);
serverWriter = new StreamWriter(networkStream, Encoding.ASCII) {
                     AutoFlush = true
                   };

// reads the server's response to the connect:  "200 news.newsserver.com"
// commenting out these lines doesn't solve the problem
while (serverReader.Peek() > -1) {
    serverReader.ReadLine();
}

serverWriter.WriteLine("authinfo user username");

// expect response "381 more authentication required", but code just blocks
string response = serverReader.ReadLine();

Кодовые блоки в последней строке предположительно ждут, пока сетевой поток отправит ответ.

Я могу избежать зависания приложения, установив цикл тайм-аута, используя serverReader.Peek(), но у меня всегда будет тайм-аут;Я никогда не получаю ответа.

Если я подключаюсь к серверу и порту напрямую и ввожу команды, я получаю немедленный ответ.

Если я позвоню serverWriter.Flush() явно, вместо использования AutoFlush собственность, я все равно блокирую и не получаю ответа.

Есть идеи, почему я не получаю ответа на сервер, используя этот подход?

Спасибо!

Решено:

Приведенный выше код делает работает на меня, поэтому я вернулся и доработал этот код до кода, который не работал.

В зависающем коде я все еще использовал цикл тайм-аута с serverReader.Peek().Peek() всегда возвращает -1, даже если в буфере есть данные для чтения!Замена цикла Peek() блокирующим вызовом ReadLine() решает мою проблему.

Изначально я включил цикл тайм-аута, потому что приложение многопоточное, и я не хотел его блокировать.Мне придется вернуться к этой проблеме и посмотреть, как можно решить синхронизацию потока без использования Peek().

Всем спасибо, хорошие ответы!

Это было полезно?

Решение 3

Приведенный выше код делает работает на меня, поэтому я вернулся и доработал этот код до кода, который не работал.

В зависающем коде я все еще использовал цикл тайм-аута с serverReader.Peek().Peek() всегда возвращает -1, даже если в буфере есть данные для чтения!Замена цикла Peek() блокирующим вызовом ReadLine() решает мою проблему.

Изначально я включил цикл тайм-аута, потому что приложение многопоточное, и я не хотел его блокировать.Мне придется вернуться к этой проблеме и посмотреть, как можно решить синхронизацию потока без использования Peek().

Всем спасибо, хорошие ответы!

Другие советы

Я сомневаюсь, что это StreamWriter Это проблема...но есть простой способ это выяснить.Скачать WireShark и посмотреть, что на самом деле приходят и уходят в сеть.Это, безусловно, самый простой способ узнать, что происходит.

Попробуйте «имя пользователя authinfo ».В RFC говорится, что командные строки NNTP должны завершаться CR-LF.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top