2

使用 aStreamWriter写入 a NetworkStream,并使用 aStreamReader读取响应。该应用程序正在向新闻服务器发送命令和读取响应。

简化代码(无错误处理等):

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(),但我总是会超时;我从来没有得到回应。

如果我直接 telnet 到服务器和端口并输入命令,我会立即得到响应。

如果我serverWriter.Flush()明确调用,而不是使用该AutoFlush属性,我仍然会阻塞并且永远不会得到响应。

任何想法为什么我没有使用这种方法得到对服务器的响应?

谢谢!

解决:

上面的代码确实对我有用,所以我回去并在该代码的基础上构建了不起作用的代码。

在挂起的代码中,我仍在使用带有 serverReader.Peek() 的超时循环。Peek() 总是返回 -1,即使缓冲区中有数据要读取!!用对 ReadLine() 的阻塞调用替换 Peek() 循环可以解决我的问题。

我把超时循环放在最初是因为应用程序是多线程的,我不想阻塞。我将不得不重新审视这个问题,看看如何在不使用 Peek() 的情况下解决线程计时问题。

谢谢大家,很好的答案!

4

3 回答 3

6

我怀疑这就是StreamWriter问题所在......但有一种简单的方法可以找出答案。下载WireShark,看看网络上实际发生了什么。这是迄今为止找出正在发生的事情的最简单的方法。

于 2009-09-11T19:31:43.073 回答
2

尝试“authinfo 用户用户名\r\n”。RFC 说 NNTP 命令行必须由 CR-LF 终止。

于 2009-09-11T19:43:37.943 回答
1

上面的代码确实对我有用,所以我回去并在该代码的基础上构建了不起作用的代码。

在挂起的代码中,我仍在使用带有 serverReader.Peek() 的超时循环。Peek() 总是返回 -1,即使缓冲区中有数据要读取!!用对 ReadLine() 的阻塞调用替换 Peek() 循环可以解决我的问题。

我把超时循环放在最初是因为应用程序是多线程的,我不想阻塞。我将不得不重新审视这个问题,看看如何在不使用 Peek() 的情况下解决线程计时问题。

谢谢大家,很好的答案!

于 2010-08-10T17:24:27.213 回答