Socket问题,为什么两次发送的信息被合并接收?(50分)

  • 主题发起人 主题发起人 fancy105
  • 开始时间 开始时间
F

fancy105

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,在ServerSocket中,按下一个按钮则发送两个字符串:
ServerSocket1.Socket.Connections[0].SendText('333');
ServerSocket1.Socket.Connections[0].SendText('4444');
而在ClientSocket.OnRead事件接收
ShowMessage(Socket.ReceiveText);
ShowMessage(Socket.ReceiveText);
如果按一下ServerSocket中的按钮,则显示一次“3334444”,
而按两下按钮则显示两次“3334444”,为什么不是按一下按钮,就显示两次,且分别是
“333”和“4444”。
另外,ServerSocket.Socket.ActiveConnections得到的数值为当前已连接的客户端数,
但在客户端断开时,它总不为0,也就是,最后一个客户端都断开了,它还是1,是怎么
回事?
 
TCP是流协议,Send一次并不意味着就发送一个分组。
 
那什么意味着一个发送动作结束?
 
对,正如楼上说的,接收时一起接收了。

要不你发送的时候sleep一下看看。
 
我实际要发的是服务器中的在线用户列表,我是采用一个字符串发一个用户信息的,
因为在线用户有多个,所以就要发多个字符串,且还要发给在线的所有在线用户,达
到每个在线用户均得到最新的在线用户列表的目的。这就已经需要双重循环了,再
sleep,那花的时间不是太长了?
 
要不你自己在发送的文本中加入起止符,例如:#,接收信息,然后处理
 
加入起止符处理还是合并接收的,就没有办法分开接收吗?
 
对接收到的那段字符处理。
 
因为Socket.ReceiveText是个内存区,你要清理掉.
s:=Socket.ReceiveText;///清理的语句
showmessage(s);
 
楼上说的不对,TCP本来就是这样,他没有边界保护,是基于流的协议,所以楼主碰到的
很正常,没什么不好理解的
 
要马,你就不用sendtext,用sendbuf算了,这样就可以控制发送和接收字节的长度。
 
sendbuf和sendText效果一样呀,呵呵
 
但是可以控制接收长度吧,譬如楼主的可以这样啊
socket.receivebuf(s1,3); socket.receivebuf(s2,4)
 
无忌兄,怎么联系你,另有问题请教,也是关于发送接收的问题。

楼主千万不要介意啊,在你的地盘上揽客,也是出于无赖
 
zhouhuilun言之有理
 
如果是用于群发的话,就更好处理了!

因为群发的对象不可能是同一个Scoket
没有上边的问题出现了!
 
有没有人懂用内存区块的方式?
即将很多的信息放到结构变量中,再将这块内存区块用Socket发出和接收!
 
要么用Sleep停留,要么将所有数据一起发送,到接收端检索
 
呵呵,我知道
定义一个结构rec,声明一个结构变量arec
var
abuf: aray[0..20] of char;
然后copymemory(abuf,arec,sizeof(arec))

应该能看懂了吧
 
系统底层带缓冲区的.
 
后退
顶部