苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 14524|回复: 7

[其他] Socket.Receive方法接收不完整的问题?

[复制链接]
发表于 2014-6-7 22:59:53 | 显示全部楼层 |阅读模式
1金钱
[C#] 纯文本查看 复制代码
byte[] buffer = new byte[1024 * 1024 * 2];
                   //int receiveLength = newSocket.Receive(buffer);
                    //if (receiveLength>0)
                    //{
dosomething.....
}
发现用上面的代码,如果发送的数据过大,读取到的数据就会不完整。如果改为while循环接收,但是只要Receive方法没接收到数据就会阻塞了,无法跳出,请问怎么解决?贴下我下面的代码
[C#] 纯文本查看 复制代码
  int receiveLength=0;
                    byte[] buffer = new byte[1024];
                    while (true)
                    {
                        receiveLength = newSocket.Receive(buffer);
                        if (receiveLength < 1)
                        {
                            break;
                        } 
                    }



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-6-7 23:08:43 | 显示全部楼层
用线程接受,就不会卡了
回复

使用道具 举报

 楼主| 发表于 2014-6-7 23:10:52 | 显示全部楼层
站长苏飞 发表于 2014-6-7 23:08
用线程接受,就不会卡了

这是开了一个线程来接收的,有数据发过来时Receive才会往下执行,没有的话就一直等待
回复

使用道具 举报

 楼主| 发表于 2014-6-7 23:19:14 | 显示全部楼层
站长苏飞 发表于 2014-6-7 23:08
用线程接受,就不会卡了

我贴一下具体代码吧
[C#] 纯文本查看 复制代码
 public void RecevieMsg(object socket)
        {
            Socket newSocket = socket as Socket;
            while (true)
            {
              byte[] buffer1 = new byte[1024 * 1024 * 2];
                try 
                {
//这个一次接收不完整,一次只接收1024,
                   //int receiveLength = newSocket.Receive(buffer);
                    //if (receiveLength>0)
                    //{
                    //    string str = Encoding.Default.GetString(buffer);
                    //    MemoryStream mStream = new MemoryStream();
                    //    BinaryFormatter bFormat = new BinaryFormatter();
                    //    mStream.Write(buffer, 0, buffer.Length);
                    //    mStream.Flush();
                    //    mStream.Position = 0;
                    //    AgreementInfo agm = new AgreementInfo();
                    //    agm = (AgreementInfo)bFormat.Deserialize(mStream);
                    //    this.ReceiveEvent(agm);
                    //}
                    int receiveLength=0;
                    byte[] buffer = new byte[1024];
                    while (true)
                    {
//循环几次后就会被Receive阻塞
                        receiveLength = newSocket.Receive(buffer);
                        if (receiveLength < 1)
                        {
                            break;
                        } 
                    }
                    MemoryStream mStream = new MemoryStream();
                    BinaryFormatter bFormat = new BinaryFormatter();
                    mStream.Write(buffer, 0, buffer.Length);
                    mStream.Flush();
                    mStream.Position = 0;
                    AgreementInfo agm = new AgreementInfo();
                    agm = (AgreementInfo)bFormat.Deserialize(mStream);
                    this.ReceiveEvent(agm);

                }
                catch (SocketException ex)
                {
                    SocketEx.Write(ex.Message);
                    break;
                }
                catch (ObjectDisposedException ex)
                {
                    SocketEx.Write(ex.Message);
                    break;
                }  
                catch (Exception ex)
                {
                    SocketEx.Write(ex.Message);
                    break;
                }
            }
        }

回复

使用道具 举报

 楼主| 发表于 2014-6-8 08:34:13 | 显示全部楼层
@站长苏飞 飞哥帮帮忙
回复

使用道具 举报

发表于 2014-6-8 10:15:44 | 显示全部楼层
没见你开线程啊
回复

使用道具 举报

 楼主| 发表于 2014-6-8 12:03:06 | 显示全部楼层

[C#] 纯文本查看 复制代码
    private Socket sck;
        private Socket newSocket;
        public void Begin(int port)
        {
            sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint endpoint = new IPEndPoint(IPAddress.Any,port);
            sck.Bind(endpoint);
            sck.Listen(10);
            Thread thread = new Thread(ConnectAccept);
            thread.IsBackground = true;
            thread.Start();
        } public void ConnectAccept()
        {
            while (true)
            {
                newSocket = sck.Accept();
                this.ConnectedEvent(newSocket.RemoteEndPoint.ToString());
                //socketDir.Add(newSoket.RemoteEndPoint.ToString(), newSoket);
                ParameterizedThreadStart par = new ParameterizedThreadStart(RecevieMsg);
                Thread thread = new Thread(par);
                thread.IsBackground = true;
                thread.Start(newSocket);
            }
        }


回复

使用道具 举报

 楼主| 发表于 2014-6-10 15:06:52 | 显示全部楼层
解决了,把发收的字节长度设大就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2025-1-10 01:23

© 2014-2021

快速回复 返回顶部 返回列表