关于delphi socket 服务端向多客户端发送长字符串的问题. ( 积分: 100 )

  • 主题发起人 主题发起人 嚼槟榔
  • 开始时间 开始时间

嚼槟榔

Unregistered / Unconfirmed
GUEST, unregistred user!
1.请教一个简单问题,我现在用Serversocket和clientsocket做通讯,在Serversocket的ClientRead事件中用SendText(str)或者SendBuf发送数据,但是当字符串比较大的时候,超过了41k,在客户端无法收到完整的数据,没有结尾。

在clientsocket的ClientSocketRead事件中用Socket.ReceiveText或者用Socket.ReceiveBuf都试过,都是无法收到完整的数据,如果不换控件,应该怎么处理呢?
本人能力有限,请高手附原代码.
 
BUF是肯定可以的,但要多次收。
 
procedure TForm1.Button1Click(Sender: TObject);
var
IdHTTP: TIdHTTP;
PostDataStream : TStringStream;
ParamData : TStringStream;
begin
IdHTTP:= TIdHTTP.Create(nil);
//IdHTTP.Host := '218.56.178.98';
PostDataStream := TStringStream.Create('');
ParamData := TStringStream.Create('');
ParamData.WriteString('UserName=0272C&Password=!zjsc.8811&PrdId=101&TelList=AAMp70X4&URL=''''&Content=aaa');
IdHTTP.Post('http://218.56.178.98/SubmitData/myService.asmx?op=Submit' , ParamData, PostDataStream);
postdatastream.Position:=0;
memo1.Text:=postdatastream.DataString;
end;
上面的代码是我要post到URL上的,返回有错误:HTTP/1.1 500 + 一些乱码
然后在群上问了下他说http://218.56.178.98/SubmitData/myService.asmx?op=Submit应该是一个webservices,但是我又不懂这个,希望有好心的人帮我看下吧,或者跟我说怎么做也行, 'UserName=0272C&Password=!zjsc.8811&PrdId=101&TelList=AAMp70X4&URL=''''&Content=aaa'参数就是这些了,可以的话谁用webservices组件帮我测试下吧,真的谢谢了,折腾了很久了,.200分.
 
对不起楼主,以前的号忘记了,新注册了号不能马上问,所以就,请原谅......
 
TCP协议当然会出现这种情况了,你发了一个"123456789",客户端不一定一次收到是完整的"123456789";可能先收到"12345"然后收到"6789",也可能先收到"1",再收到"234",后又收到"56789"......
客户端要设置一个缓冲区,把收到这些信息先保存起来,等到收到一个完整的数据再进行处理,数据包可以设置结束标志,也可以发定长的,总之,客户端必须要知道服务器端到底发送了多少字节的数据才可以处理。
 
各位不好意思哟,由于本人上网不方便,不能及时跟回复.首先感谢各位的点拨.
但问题仍未解决,本人思路也有一些,但在实际编码的过程中,能力有限,不行啊.请再发贴,附源码.十分感谢!
 
各位高手呀,帮帮小弟呀!再次谢意!!
 
楼上的朋友,经过你的提醒,我已经利用内存流接收到了数据,但怎样把流中的数据转换成字符串呀?
 
这是你收数据的问题了,
原理上一个TCP包经过交换机、路由器
大于1460 byte 包的会拆分为很多小包,小于1460 byte的包如果发送过快会组合成一个大包的。
特别是在用户数很多,数据量很大的情况下,收取数据包这部分代码很少有人能写好的
 
取字符串的长度,按后根据长度来确定发送方式
 
后退
顶部