我正在使用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.