在c#pop3客户端发出TOP命令时出错

问题描述:

下面有几个问题。一个是Resharper告诉我serverResponse值不能用在任何执行路径中。另一个与获取每封邮件的标题有关。如果我发出TOP 1 0,它不会抛出任何错误,它只是挂在那里。如果我发出一个TOP 1 0,然后是Environment.NewLine,它会告诉我"-ERR no such message."我从以下link得到了代码。在c#pop3客户端发出TOP命令时出错

for (int i = 0; i <= messageCount; i++) 
{ 
    _data = "TOP " + i + " 0"; 
    _sizeOfData = Encoding.ASCII.GetBytes(_data.ToCharArray()); 
    _networkStream.Write(_sizeOfData,0,_sizeOfData.Length); 

    serverResponse = _streamReader.ReadLine(); 

    while (true) 
    { 
     serverResponse = _streamReader.ReadLine(); 

     if (serverResponse == ".") break; 
     if (serverResponse.Length > 4) 
     { 
      if (serverResponse.Substring(0, 5) == "From:") 
       lstMessages.Items.Add(serverResponse); 
     } 
    } 
} 

你为什么要发送原始字节而不是原来在文章中的文本?事实上,我实际上无法让您的代码编译,因为GetBytes返回byte[],但Write预计char[]。我可以把它改成这一点,至少它编译:

char[] _sizeOfData = Encoding.ASCII.GetChars(Encoding.ASCII.GetBytes(_data.ToCharArray())); 

不过这些都不会被遮蔽,你可能不会遇到反正,即非ASCII字符的潜在问题。 (你的代码将导致问号出现其中,如果他们想过会导致你头疼调试非ASCII字符,但他们不应该在这种情况下发生的。)相反,你可以这样做:

char[] _sizeOfData = _data.ToCharArray(); 

无论如何,你的代码挂起的原因之一是因为文章中的代码使用WriteLine(),它为你发送NewLine。因此,无论使用WriteLine()(推荐)或更改您的字符串:

string _data = "TOP " + i + " 0\n"; 

另一个原因是挂你没有每行后冲水:

_networkStream.Flush(); 

一个原因,你可能会是挂如果你有大量的消息,并且你正在UI线程上处理所有这些。不要将复杂性,输出结果输出到Console或其他您可以实时监视的其他东西,直到找出网络部分,然后添加对象/集合。

至于错误消息,将代码片段插入该文章的主代码并修复上面提到的问题后,我无法重现错误。但是,如果您没有可用于POP3下载的消息,则TOP 1 0会生成该消息。

+0

我实际上是使用另一个网站的代码,并在我去的时候进行调整。我继续前进,转而使用StreamReader,StreamWriter和NetworkStream,我也打电话给Flush。现在一切都很好。谢谢。 – Xaisoft