最近一直在做服务器C/S架构的。遇到不少问题。我采用完成端口进行开发。
1、发现自己开发服务器 在传输速度上虽然快,但是如果连续发送数据的话。会出现数据丢失,接不包。(TCP/IP协议 按协议应该不会出现这样的问题的?可我的就出现这样的问题。纳闷中。)
2、在传输过程中 如果客户端采用无限制过期时间的话,当某些无法预料到的问题的时候,客户处于等等接收状态。一直持续下去。
3、老问题:IIS传输数据时 对数据是如何操作的 为什么其速度那么快。如果采用压缩和解压缩的话 是否为一次性压缩和解压缩,如果是一次性的话,数据量大的时候怎么办?我试过出现内存溢出的问题,或者申请空间过大内存错误。
1、所谓的丢包,在tcp协议里面几乎不会出现,这个是粘包/半包没有正确处理的缘故。
2、通信状态处理,需要加上心跳包来作定期检测。
3、IIS传输数据,说到底还是基于tcp协议的,传输效率当然不慢。当传输数据量过大时,底层会自动将大包切成小包发送,默认是1.5K字节左右。最好是自己切包,切成1k左右的小包,方便实用。如果是传输数据量极大,超出内存上限,可以采用分包方式,每次发送一部分数据,接受端自己组包即可。
如果连续发送数据的话。会出现数据丢失,接不包。
这个问题我以前用完成端口的异步Socket做服务器是遇到过这个问题,也困惑很久。
解决方法是为每个Socket会话添加一个发送队列,只有当前一个包发送成功后才发送后一个包。
protected virtual void SafeSend(TSession s, DataBlock data)
{
s.SendQueue.Enqueue(data);
//只有一个数据包,立即发送
//如果有多个包放进的数据放进发送队列
if (s.SendQueue.Count == 1)
{
AtomSend(s, data);
}
}
protected void AtomSend(TSession s, DataBlock block)
{
try
{
if (s == null)
throw new ArgumentNullException("session");
if (block == null)
throw new ArgumentNullException("data block");
block.Tag = s;
s.Socket.BeginSend(block.Buffer, block.ReadIndex,
block.Length, SocketFlags.None, new AsyncCallback(SendCallback), block);
}
catch (Exception ex)
{
OnSessionError(s, ex);
}
}