2012-02-20 173 views
0

我正在使用TcpClient和NetworkStream来启动到POP服务器的连接以进行身份​​验证。糟糕的做法,有利于学习。带有TcpClient的StreamReader返回不正确的字符串

当我远程登录到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("quit\n"); 
     } 
     } 
     } 
    } 
    } 

但是,当我输入此代码时,查询进入无限循环。令人困惑的是,当我将reader.ReadLine()调用减少到一个时,它返回“+ OK Dovecot Ready”!所以它连接到POP服务器,但在此之后它将不起作用。有没有人有任何想法可能造成这种情况?

+0

是“循环”正确的术语在这里使用?从代码中不清楚如何循环可能发生。 – spender 2012-02-20 11:43:13

回答

2

不,它不是一个无限循环。第二次调用reader.ReadLine()将不会返回,因为您尚未完成将USER命令发送到服务器。您必须使用.WriteLine代替.Write

发送换行符试试这个:

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

这:

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

编辑:按spender的建议,增加了来电.Flush

+0

我试过这个无济于事。我改变了。写入.WriteLine,它仍然无限循环。 – 2012-02-20 11:41:35

+0

尝试在每次调用'.WriteLine()'后添加'.Flush()' – 2012-02-20 11:43:33

+0

谢谢! :)它现在工作完美,将在两分钟内接受这个答案! – 2012-02-20 11:46:56

1

除了@ atornblad的回答,在写入流并需要响应之后,请考虑writer.Flush()

0

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

一些其他问题: 哪里是你的无限循环?我在你的代码中看不到任何循环。 ReadLine是一种阻塞方法。也许行结束字符是问题?尝试使用Read()来获得字符明智的输出。

它在哪里返回“+ OK Dovecot Ready”?如果它在你的Gui中,试着在应该显示结果的元素上调用.Refresh,因为你的GUI线程会被以下阻塞的ReadLine()调用阻塞。

这是\ n的目的?

writer.WriteLine("quit\n"); 

这导致双线终止。

,并尝试使用

.Flush() after writing to your stream. 
+0

ReadLine与POP服务器进行通信是完全合理的。 POP服务器返回“+ OK Dovecot Ready”。这显然是一个Web应用程序,所以没有元素可以调用.Refresh,并且没有GUI线程。 – 2012-02-20 11:50:38

相关问题