带有TcpClient的StreamReader返回不正确的字符串



我正在使用TcpClient和NetworkStream启动与POP服务器的连接以进行身份验证。不好的练习,有益于学习。

当我用Telnet登录POP服务器时,最初产生的响应是:

+OK Dovecot Ready

用户输入用户名

+OK

用户输入已检查的通行证+OK如果有效-N如果不是

我的程序正在连接到POP服务器,打开StreamReader和Writer,写入所有这些数据并检查响应。

   using (TcpClient client = new TcpClient("host.university.ie", 110)) {
        using (NetworkStream stream = client.GetStream()) {
        using (StreamReader reader = new StreamReader(stream)) {
        using (StreamWriter writer = new StreamWriter(stream)) {
            string response = reader.ReadLine();
            writer.Write("USER " + username );
            response = reader.ReadLine();
            writer.Write("PASS " + password );
            string response = reader.ReadLine();
            Response.Write(@"<script language='javascript'>alert('The following response as been received: n" + response + " .');</script>");
            isValid = response[ 0 ].Equals('+');
            writer.WriteLine("quitn");
        }
       }
      }
     }
    }

但是,当我输入此代码时,查询将进入一个无限循环。令人困惑的是,当我减少给读者打电话的次数时。ReadLine()为1,则返回"+OK Dovecot Ready"!因此,它正在连接到POP服务器,但在此之后将无法工作。有人知道是什么原因造成的吗?

不,它不是一个无限循环。对reader.ReadLine()的第二次调用将永远不会返回,因为您还没有完成向服务器发送USER命令。必须使用.WriteLine而不是.Write 发送换行符

试试这个:

writer.WriteLine("USER " + username);
writer.Flush();

这个:

writer.WriteLine("PASS " + password);
writer.Flush();

编辑:根据消费者的建议,增加了对.Flush的调用。

除了@atornblad的答案外,在写入流并需要响应后,还可以考虑writer.Flush()

尝试检查流上的CanWrite和CanRead并检查您的编码:请参阅:http://msdn.microsoft.com/de-de/library/system.net.sockets.tcpclient.getstream.aspx

还有一些问题:你的无限循环在哪里?我在你的代码中看不到任何循环。ReadLine是一种阻塞方法。也许行尾字符是问题所在?请尝试Read()以获得按字符的输出。

它在哪里返回"+OK Dovecot Ready"?如果它在您的Gui中,请尝试调用。刷新应该显示结果的元素,因为您的Gui线程可能会被以下阻塞ReadLine()调用阻塞。

这是故意的吗?

writer.WriteLine("quitn"); 

这导致双线端接。

并尝试使用

.Flush() after writing to your stream.

相关内容

  • 没有找到相关文章

最新更新