Using a StreamWriter
写信给NetworkStream
, and 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();
代码在最后一行阻塞,大概是在等待网络流发送响应。
我可以通过设置超时循环来避免挂起应用程序serverReader.Peek()
,但我总是会超时;我从来没有得到回应。
如果我直接远程登录到服务器和端口并输入命令,我会立即得到响应。
如果我打电话serverWriter.Flush()
明确地,而不是使用AutoFlush
财产,我仍然阻止并且从未得到回应。
有什么想法为什么我使用这种方法没有得到服务器的响应吗?
Thanks!
解决:
上面的代码does为我工作,所以我回去并在该代码的基础上构建了不起作用的代码。
在挂起的代码中,我仍在使用 serverReader.Peek() 的超时循环。即使缓冲区中有数据可供读取,Peek() 始终返回 -1!用对 ReadLine() 的阻塞调用替换 Peek() 循环解决了我的问题。
我最初放入超时循环是因为该应用程序是多线程的,并且我不想阻塞。我将不得不重新审视这个问题,看看如何在不使用 Peek() 的情况下解决线程计时问题。
谢谢大家,好的答案!