求C# Socket传输大量数据解决办法??尤其是在服务器端接收办法。我用的是在服务器端接收时按照接受的先后顺序重新组合,但用这种办法在接收时会出现问题,有时能正确接收,有时不能正常接收。
解决方案 »
- radControls for asp.net 控件是不是很垃圾啊?
- 初学C#,请问如何在一个窗体用ToolStripMenuItem_Click控制另一个子窗体的打开关闭,并且焦点不变。
- 试用了一下 OracleDataAdapter 功能,但是upadate时遇到问题。数据不能更新。如下代码有什么问题?
- C#可以这样写做吗?
- 怎么用C#编写网络抓包工具?
- <!-- WinForm C#连接ACCESS数据库 未处理的“System.Data.OleDb.OleDbException”类型的异常出现在 system.data.dll 中 帮帮我啊
- 上传附件的问题,加分求助啊~~~~~
- 请教达人,解决Media Player控件问题
- c# asp.net 无法直接启动带有“类库输出类型”的项目 若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目。将这个可执行项目设置为启动项
- 自定义的类中包含了pictureBox怎么让他显示?急
- 恳求大家的高见??
- C#解决方案下面可以添加若干个项目,这些项目都是平行的、独立的。不用引用方法,而如何将这些项目之间通过命名空间关联起来。
#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表示最后一个包
发送方发完后Recevie等待,当收到上次接收成功消息后.继续发送
我用的是NetworkStream类。
具体的来说,
1:控制你每次send的时间间隔。
2:有必须的话可以采用异步响应的试,等收到对方的响应之后再传下一部分。TCP的连接控制协议只能在一定范围内控制流量,一旦流量过大,超过其网络负载,时间一长,缓存空间不够的时候,你的数据就非丢不可了。