最近写了一个接收邮件的,使用retr获取邮件的时候,在读取网络流的时候老是超时之类的,
执行下一条指令的时候老是报错,但是我用telnet下执行就一切正常。还有就是NetworkStream获取内容的速度真是慢,有没有好的解决方法?

解决方案 »

  1.   

    应该是接收的过程没写好吧, 最初我在写通讯的时候也碰到过; 就是在使用NetworkStream.Read(buf,pos,size)的时候。
      

  2.   

    对的,我是使用ReadToEnd读取的,速度超慢
      

  3.   

    用这个方法试试, 它在接收大数据时会很耗内存,几M以下的应该是没问题的。
    List<Byte> bufList = new List<byte>();大量的数据应该输出到文件流,或其他设备中。不应该直接放到内存里。
            private bool ReceiveStream(NetworkStream stream, ref byte[] origBuf, out byte[] outBuf)
            {
                outBuf = null;            if (!stream.DataAvailable)
                {
                    return false;
                }            List<Byte> bufList = new List<byte>();
                int total = 0;
                while (stream.DataAvailable)
                {
                    int len = this.TryReceive(stream, origBuf, 0, m_BufSize);
                    if (len <= 0)
                    {
                        break;
                    }                bufList.AddRange(origBuf);
                    total += len;
                    if (len < m_BufSize)
                    {
                        bufList.RemoveRange(total, m_BufSize - len);
                        break;
                    }
                }            if (total == 0)
                {
                    return false;
                }            this.ReWaitingTimer();            outBuf = bufList.ToArray();
                return true;
            }
            /// <summary>
            /// TryReceive
            /// </summary>
            /// <param name="stream"></param>
            /// <param name="origBuf"></param>
            /// <param name="outBuf"></param>
            /// <returns></returns>
            private int TryReceive(NetworkStream stream, byte[] buffer, int offset, int size)
            {
                //try
                //{
                //}
                //catch (IOException)
                //{
                //}            //Array.Clear(buffer, offset, size);
                return stream.Read(buffer, offset, size);
            }
      

  4.   

    看了msdn这一段
    当需要从流的当前位置到末尾读取所有输入时,ReadToEnd 的性能最佳。如果需要对从流中读取的字符数进行进一步的控制,请使用 Read(Char[],Int32,Int32) 方法重载,它通常可达到更佳的性能。还是直接使用NetworkStream read比较快啊
      

  5.   

    ReadToEnd 好歹他没用使用到缓存。
    在读取少量数据时,说他性能最佳,我觉得是完全有道理。你想想如果是在读G级别的文件,ReadToEnd就绝对说不上好了(它肯定都是先读到你内存中)。此时,BufferedStream 类应该是接收数据的首选。Read方法每次读的数据块大小也会影响你的接收速度。不信可试试。
      

  6.   

    Read方法每次读的数据块大小也会影响你的接收速度 ,这个是肯定的了