代码之家  ›  专栏  ›  技术社区  ›  James King

streamwriter无法刷新到networkstream

  •  2
  • James King  · 技术社区  · 15 年前

    使用A StreamWriter 写信给某人 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();
    

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

    我可以通过设置超时循环来避免挂起应用程序 serverReader.Peek() 但是我总是超时;我从来没有得到响应。

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

    如果我打电话 serverWriter.Flush() 显式地,而不是使用 AutoFlush 属性,我仍然阻止并且从未得到响应。

    你知道为什么我不能用这种方法得到服务器的响应吗?

    谢谢!

    断然的:

    上述代码 为我工作,所以我回到过去,建立在代码的基础上,得到了不起作用的代码。

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

    我之所以加入超时循环,是因为这个应用程序是多线程的,我不想阻塞它。我将不得不重新讨论这个问题,并了解如何在不使用peek()的情况下解决线程计时问题。

    谢谢大家,回答得好!

    3 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    15 年前

    我怀疑这是 StreamWriter 这就是问题所在…但有一个简单的方法可以找到答案。下载 WireShark 看看是什么 事实上 在网络上来来往往。这是迄今为止最简单的方法来查明发生了什么。

        2
  •  2
  •   R Ubben    15 年前

    尝试“authinfo用户用户名\r\n”。RFC说nntp命令行必须由CR-LF终止。

        3
  •  1
  •   James King    14 年前

    上述代码 为我工作,所以我回到过去,建立在代码的基础上,得到了不起作用的代码。

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

    我之所以加入超时循环,是因为这个应用程序是多线程的,我不想阻塞它。我将不得不重新讨论这个问题,并了解如何在不使用peek()的情况下解决线程计时问题。

    谢谢大家,回答得好!