使用StreamWriter写入NetworkStreamStreamReader读取响应。该应用正在发送命令并向新闻服务器读取响应。

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

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()即可解决线程计时问题。

谢谢大家,很好的答案!

最佳答案

我怀疑这是StreamWriter造成的问题...但是有一种简单的找出方法。下载WireShark并查看网络上实际发生的事情。到目前为止,这是找出正在发生的事情的最简单方法。

关于.net - StreamWriter不会刷新到NetworkStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1412852/

10-12 21:38