关于socket接收数据的问题(100分)

  • 主题发起人 主题发起人 iwillgo2
  • 开始时间 开始时间
I

iwillgo2

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个测试:
在Client端连续发送几个数据包:
ClientSocket1.SendText('12');
ClientSocket1.SendText('3456');
ClientSocket1.SendText('789');

在Server端接收:(在Read事件)
procedure TF_Server.Server1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
Mem_Send.Lines.Add(socket.ReceiveText);
end;

结果:
按照我的想法应该为:
12
3456
789

实际接收:123456789
假如我在发送的时候每一个SendText设断点,则收到的数据:
12
3456
789

我如何作才能使我正确收到的数据为:
12
3456
789

 
假如你使用ics控件的话,flush是很方便的
 
要加控制字符,哥们。
最好把发送得数据包写好定义。便于控制。
 
tcp/ip算法决定的,是为了提高发送效率!
 
看看socket方面的书就明白为什么了。
如果需要实现你的功能,在发送端加延时就可以实现。
 
ClientSocket1.SendText('12$3456$789$');
作为一条信息发送出去!中间用$隔开

然后在服务端再判断分解接收到的字符串!
 
需要自己定义发送接收协议的,这组控制只保证发送数据的准确性,但不管接收顺序和是否能及时接收的;
比如使用类似停止等待协议来实现(感觉好像这是最简单的网络协议了)
const
xy_begin='1';
xy_ok='2';
发送数据前,先发送xy_begin,问服务器是否能接收数据?
服务器如果能接收数据的话,发送xy_ok,开始准备接收数据:
客户端接收到xy_ok时(服务器准备好接收了),开始发送数据。
这样就能完全正确的接收数据了
每次发送都这样定义一下就可以保证每次发送的数据都正确啦
如果发送的数据量大的话还可以定义:下一块标志,结束标志,出错标志等等

我用这方法做过传送文件的例子,能正确的传送过来,得分好多块传送,不过速度好慢,不实用,呵呵,传送一些数据量小的东西还是挺快的
我的程序这会找不到了,要不可以粘上去,呵呵,不知道大家还有更好的方法没?
gz
 
可以这么做
ClientSocket1.SendText('12');
服务器收到后向客户端发送一个命令,当客户端收到后在发送下一个字符串
ClientSocket1.SendText('3456');

ClientSocket1.SendText('789');

 
呵呵,我说的根楼上的意思差不多
 
使用TurboPower的IPServer,IPClient就比较简单了,不过原理是一样的,TurboPower在你SendText的时候会在你发送的字符串尾部加上#13#10控制字符,client端在触发Receive事件的时候会判断接受的字符串是否有#13#10控制字符,如果有就触发Receive事件。这样子就不会出现楼主的问题了。
 
后退
顶部