StreamWriter不会刷新到NetworkStream

时间:2009-09-11 19:29:21

标签: .net networkstream streamwriter

使用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()的情况下解决线程时序问题。

谢谢大家,好的答案!

3 个答案:

答案 0 :(得分:6)

我怀疑这是问题的StreamWriter ......但是有一个简单的方法可以找到答案。下载WireShark,查看实际在网络上传入和传输的内容。到目前为止,这是找出正在发生的事情的最简单方法。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

上面的代码确实对我有用,所以我回过头来,将代码构建到不起作用的代码上。

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

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

谢谢大家,好的答案!

相关问题