StreamWriter不会刷新到NetworkStream

Jam*_*ing 2 .net networkstream streamwriter

使用a StreamWriter写入a NetworkStream和a 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();
Run Code Online (Sandbox Code Playgroud)

代码在最后一行阻塞,可能等待网络流发送响应.

我可以通过设置超时循环来避免挂起应用程序serverReader.Peek(),但我会一直超时; 我从来没有得到回应.

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

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

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

谢谢!

解决:

上面的代码为我工作,所以我回去,并在该代码建成,将无法正常工作的代码.

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

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

谢谢大家,好的答案!

Jon*_*eet 6

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