我有一个应用程序,使用它来执行IMAP命令:
TcpClient
连接到IMAP服务器SslStream
编写和阅读命令问题:
while
循环SslStream.Read
似乎无法正常工作StreamReader.ReadLine
,ReadToEnd
,Read
方法不起作用示例代码:
while ((l = reader.ReadLine()) != null)
{
output.AppendLine(l);
}
此代码段会读取1到2行并挂起reader.Readline()
。
解决方法我尝试设置ReadTimeout
属性:
try
{
_output=new byte[_tcpclient.ReceiveBufferSize];
_sslstream.Read(_output, 0, _output.Length);
textBox1.Text = Encoding.ASCII.GetString(_output);
}
catch (IOException ex)
{
textBox1.Text ="ERROR !! " + ex.Message;
}
帮助:
注意:我不想使用任何第三方库。
答案 0 :(得分:3)
TCP流无法知道当前响应是否已完成。它只知道它是否刚刚在线上接收数据;它无法知道下一个数据包是否会立即出现(多数据包响应),或者它是否会更晚出现(如果响应完成)。
相反,您需要预测何时会获得更多数据;您应该继续阅读,直到收到标记的完成响应,如IMAP协议中所述。
但是,IMAP似乎打算在后台线程上连续读取,因为服务器可以随时向您发送信息。因此,您可能应该有一个始终位于ReadLine()
的单独线程。