使用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()
设置超时循环来避免挂起应用程序,但我总是会超时;我没有得到回应。如果我通过telnet直接连接到服务器和端口并输入命令,则会立即得到响应。
如果我显式调用
serverWriter.Flush()
,而不是使用AutoFlush
属性,我仍然会阻塞并且永远不会得到响应。有什么想法为什么我无法使用这种方法来响应服务器?
谢谢!
解决:
上面的代码对我来说确实有用,所以我回过头来在不起作用的代码的基础上构建。
在挂起的代码中,我仍在使用serverReader.Peek()超时循环。即使缓冲区中有要读取的数据,Peek()始终返回-1!用对ReadLine()的阻塞调用替换Peek()循环解决了我的问题。
我之所以加入超时循环,是因为该应用程序是多线程的,并且我不想阻塞。我将不得不重新审视此问题,并了解如何不使用Peek()即可解决线程计时问题。
谢谢大家,很好的答案!
最佳答案
我怀疑这是StreamWriter
造成的问题...但是有一种简单的找出方法。下载WireShark并查看网络上实际发生的事情。到目前为止,这是找出正在发生的事情的最简单方法。
关于.net - StreamWriter不会刷新到NetworkStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1412852/