2012-02-20 127 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

相關問題