求C# Socket传输大量数据解决办法??尤其是在服务器端接收办法。我用的是在服务器端接收时按照接受的先后顺序重新组合,但用这种办法在接收时会出现问题,有时能正确接收,有时不能正常接收。

解决方案 »

  1.   


     #region 磁盘空间管理:删除Player上指定的媒体文件
            
            public void CommandSetManageDisk(byte gid, byte did,string deletestring)
            {
                //   分包发送
                string ManageDiskStr = deletestring;
                byte i = 0;
                Encoding GB2312Encoding = UnicodeEncoding.GetEncoding("GB2312");
                byte[] ManageDisk = GB2312Encoding.GetBytes(ManageDiskStr);
                byte [] myManageDisk = new byte [300];
                int txtLength = ManageDisk.Length;            int packetizationtimer = txtLength / 300;
                int packetizationresidue = txtLength % 300;
                int packetizationsender;
                //如果没有余数,发包时就不用多发一次 
                if (packetizationresidue > 0)
                {
                    packetizationsender = packetizationtimer + 1;
                }
                else
                {
                    packetizationsender = packetizationtimer;
                }
                //开始分包发送
                for (i = 0; i < packetizationsender; i++)
                {
                    if (i < packetizationtimer)
                    {
                        Array.Copy(ManageDisk, i * 300, myManageDisk, 0, 300);
                    }
                    else
                    {
                        Array.Copy(ManageDisk, i * 300, myManageDisk, 0, packetizationresidue);
                    }                PlayerMessages.SetManageDisk setmanagedisk  = new PlayerMessages.SetManageDisk();
                    setmanagedisk.direct = 0x02;
                    setmanagedisk.category = 0x03;
                    setmanagedisk.type = 0x10;
                  
                    setmanagedisk.GroupID = gid ;
                    setmanagedisk.DeviceID = did ;
                    setmanagedisk.Sequence = i;
                    setmanagedisk.size  = 300;
                     if (i == (packetizationsender-1)) {                     setmanagedisk.Sequence=0xFF;
                         setmanagedisk.size  =(ushort)packetizationresidue;
                                 
                     }                setmanagedisk.DeleteFile = myManageDisk;                byte[] data = PlayerMessages.StructToBytes(setmanagedisk);
                    ssock.OnUDPDataSend(data);
                }
            }
              
     PlayerMessages.SetManageDisk 是struct,UDP包的数据结构
     setmanagedisk.Sequence = i;表示包的序号,0xFF表示最后一个包
      

  2.   

    分包处理,接收方收到包后,send一下,表示已经接收成功
    发送方发完后Recevie等待,当收到上次接收成功消息后.继续发送
      

  3.   

    有TCP协议的socket程序没有??你上面这个是UDP的。我发送的时候也是采用的分包,传输的是对象序列化后的数据,在传输少量数据时是没有问题,但在传输超过50万条数据的时候就会出现错误。而且有时还会出现“主机中的软件已关闭一个远程连接”的错误提示。
    我用的是NetworkStream类。
      

  4.   

    HOHO,这种建议你分开发送会比较好。
    具体的来说,
    1:控制你每次send的时间间隔。
    2:有必须的话可以采用异步响应的试,等收到对方的响应之后再传下一部分。TCP的连接控制协议只能在一定范围内控制流量,一旦流量过大,超过其网络负载,时间一长,缓存空间不够的时候,你的数据就非丢不可了。