使用TcpClient关于接收数据遇到几点的问题 只有在使用Receiveln才能触发OnRecieve事件?反了吧?一旦有数据到,就会触发OnRecieve,只是此时数据可能尚未完全到达,接受时需要注意 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不是啊,就是这样的,我执行以下RecieveIn才会触发OnRecieve 哈哈,下面是发送代码procedure TForm1.RzButton1Click(Sender: TObject);begin tcpClient1.Active :=true; TcpClient1.Sendln('FD0,001,060'+#13#10) ;end;下面我是我执行RecieveIn方法的代码procedure TForm1.RzButton2Click(Sender: TObject);var s:string;begin s:=TcpClient1.Receiveln() ;end;当执行上述操作后,发生OnRecieve事件procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer);var s:string;begin SetLength(s,DataLen); Move(buf^,s[1],DataLen); mmo1.Lines.Add(s);end;代码就这么简单,具体的数据格式就顶楼 1、可以设置为同步或者异步,通过修改属性BlockMode2、因为这个控件的OnRecieve方法只由ReceiveBuf回调,而Receiveln就是调用ReceiveBuf实现的3、建议你通讯协议里加上包结尾,比如一个包以2个#13#10结尾,这样你可以使用Receiveln(#13#10#13#10)收取整个完整的包,数据处理则是在OnRecieve中 你好,针对第二点,当我发送请求指令后,我该何时调用RecieveIn方法比较合理,如果在异步或者同步的情况,调用时间是否有区别?谢谢你 你好,针对第二点,当我发送请求指令后,我该何时调用RecieveIn方法比较合理,如果在异步或者同步的情况,调用时间是否有区别?谢谢你同步模式下接受界面线程阻塞的话直接Receiveln就可以,不接受界面线程阻塞的话,有2种选择1、开个线程,线程里Receiveln,但是因为OnRecieve不是在主线程被调用的,所以记得不能直接操作vcl。2、开个定时器,在定时器中使用控件的WaitForData方法,返回值为True的时候调用一次Receiveln。 其中2方法当包尾未发来时候还是会产生阻塞。异步模式下开个定时器,定时器里直接Receiveln就可以,当然也是可以开线程,线程中Receiveln,这个你自己决定。 installshield 安装包问题 Timage的问题 请教各位,关于BDE的问题。可以在BDE配置界面中双击别名连接数据库,但是在应用程序中无法连接。 紧急求助,如何定时删除文件夹? 在DELPHI里能否实现这样一个与浏览器有关的好象有点"异想天开"的问题...... 什么地方 控件下载又快又多?谢谢 关于数据库类型问题 怎样使TStringGtid滚到我需要的col和row DELPHI 中如何控制动态创建的控件 急急急!如何遍历程序中的菜单项? ?? 获取路由器Wan口IP地址,即外网IP地址 ?? 求 ShockwaveFlash 内存释放
不是啊,就是这样的,我执行以下RecieveIn才会触发OnRecieve
哈哈,下面是发送代码procedure TForm1.RzButton1Click(Sender: TObject);
begin
tcpClient1.Active :=true;
TcpClient1.Sendln('FD0,001,060'+#13#10) ;
end;
下面我是我执行RecieveIn方法的代码procedure TForm1.RzButton2Click(Sender: TObject);
var
s:string;
begin
s:=TcpClient1.Receiveln() ;
end;
当执行上述操作后,发生OnRecieve事件procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
var DataLen: Integer);
var
s:string;
begin
SetLength(s,DataLen);
Move(buf^,s[1],DataLen);
mmo1.Lines.Add(s);
end;
代码就这么简单,具体的数据格式就顶楼
2、因为这个控件的OnRecieve方法只由ReceiveBuf回调,而Receiveln就是调用ReceiveBuf实现的
3、建议你通讯协议里加上包结尾,比如一个包以2个#13#10结尾,这样你可以使用Receiveln(#13#10#13#10)收取整个完整的包,数据处理则是在OnRecieve中
同步模式下
接受界面线程阻塞的话直接Receiveln就可以,不接受界面线程阻塞的话,有2种选择1、开个线程,线程里Receiveln,但是因为OnRecieve不是在主线程被调用的,所以记得不能直接操作vcl。2、开个定时器,在定时器中使用控件的WaitForData方法,返回值为True的时候调用一次Receiveln。 其中2方法当包尾未发来时候还是会产生阻塞。
异步模式下
开个定时器,定时器里直接Receiveln就可以,当然也是可以开线程,线程中Receiveln,这个你自己决定。