TServerSocket收到其它客户端的数据,再转给指定的客户端,数据出现粘包现象,怎么处理?(50分)

  • 主题发起人 主题发起人 arethusa
  • 开始时间 开始时间
A

arethusa

Unregistered / Unconfirmed
GUEST, unregistred user!
TServerSocket收到其它客户端的数据,再转给指定的客户端,数据出现粘包现象,怎么处理?
 
看看你的代码?
 
粘包现象???
粘包现象???
 
是的啊。接收的时候好像粘包现象不是很严重。但是,在再发送到客户端的时候,数据量大的时候粘包现象有时就很严重!
 
大家有什么好的办法来解决吗?我现在是把接收的数据放在队列里。发送到客户端的时候再弹出。有时客户端收到的数据有时就是几条连在一起的。
 
TCP不是流式协议。你说的粘包现象是因为你自己设计缺陷造成的。 在TCP上一般实现数据包的边界的方法是包头先发送一个4字节的长度。
 
你定义的协议应该每包数据长度是一定的,这样取的时候可以按照每包的长度进行。
否则的话,肯定都在系统接收缓冲区里呀。当然缓冲区里可能同时有几包数据在里面。
 
用ICS,省得自己處理粘包。
 
一次只接收指定长度的数据。如果数据量过大的时候,会造成数据延迟吧?
 
系统不会延迟的
就看你程序怎么控制了
 
定义协议传送规则:

Const

MP_QUERY ='aaaaa';//标志将要发送文件名
MP_REFUSE ='bbbbb'; //标志服务器拒绝接收
MP_ACCEPT ='ccccc'; //标志服务器同意接收文件
MP_NEXTWILLBEDATA='ddddd';//标志将要传递数据
MP_DATA ='eeeee';//标志服务器端准备接收数据
MP_ABORT ='fffff'; //标志客户端取消了本次发送操作
MP_END='iiiii'; //标志已经发送完毕
MP_FILEPROPERTY='jjjjj';//标志发送的文件长度
MP_LOGIN='ggggg';//编号加用户登陆登陆
MP_FAIL='hhhhh'; //登陆失败
MP_SUCCESS='OOOOO';//登陆成功
iBYTEPERSEND=1024; //指定每次发送包的大小


调用时用:
client用这个
filena:='test.doc';
cs.Socket.SendText(MP_QUERY+welcome.usernumb.Text+'.doc');
服务端用这个:
Socket.SendText(MP_ACCEPT); //发送同意接收文件的信息


我记忆中有个 <实景聊天>的软件,全开代码,仔细看下,用了delphiX组件做图,SERVERSOCKET收到转发所有任何客户!
我写了打字软件,那控制中的套接和转发代码不便公开!
 
每一个数据包的结尾都用自己的格式做一个结尾标记,然后服务器端收到以后根据格式分离开就行了,最好连续8个特殊字符,比#10#11#12#13#14#15之类的
 
我用的控件是:TServerSocket.数据是以#结尾,每次收就收到#。有这个函数吗?
 
先发个固定字节的报文,里面包含着协议和接下来要发送的真正报文的长度。然后根据这个长度来收剩下的报文。
 
后退
顶部