简单代码示意如下:
如果用
sResponse := IdTCPClient1.ReadLn;
则数据读不全,读出的数据是
#1#4#0#1#0#1#0'@j4譎'#8'傆O '#$A8
如果用
setlength(sResponse,64);
IdTCPClient1.ReadBuffer(sResponse[1],64);
则可以读全,但是这里是写死了读取64个字节,怎么样才能读全部服务端返回的数据呢?
全部数据是:#1#4#0#1#0#1#0'@j4譎'#8'傆O ?'#$A'僑漃'#$10'??S?\{?'#$11'技縗{?'#$11'技縗{?'#$11'技烤>eQ陣?'注:此是客户端代码,服务端是由VC编写的
如果用
sResponse := IdTCPClient1.ReadLn;
则数据读不全,读出的数据是
#1#4#0#1#0#1#0'@j4譎'#8'傆O '#$A8
如果用
setlength(sResponse,64);
IdTCPClient1.ReadBuffer(sResponse[1],64);
则可以读全,但是这里是写死了读取64个字节,怎么样才能读全部服务端返回的数据呢?
全部数据是:#1#4#0#1#0#1#0'@j4譎'#8'傆O ?'#$A'僑漃'#$10'??S?\{?'#$11'技縗{?'#$11'技縗{?'#$11'技烤>eQ陣?'注:此是客户端代码,服务端是由VC编写的
解决方案 »
- word2003现在不是MDI窗口的,原来是MDI窗口的,谁做过类似WORD2003那样的 窗口样式 。谢谢!还有FOXMAIL也一样
- 高分求一个经典而又使用的递归问题------------在线等待!!!
- 新建文件出错!
- 关于数据导成EXECL文件的问题
- 怎么使按下回车键时光标定位下一个控件?
- adoquery.filter := 'xxxxxx' ,Access2000数据库过滤问题
- 谁能告诉我,在DELPHI里,按下BUTTON键,出现新窗口呀……
- 银行查询机故障问题
- 请帮忙,有分送............
- 急、急,请高手帮忙,主/从表的打印
- 征求家谱管理软件
- 关于access随机抽题问题
RecvCount:=self.IdTCPClient.IOHandler.InputBuffer.Size;
这样写可以吗?
IdTCPClient1.WriteBuffer(str[1],Length(str));
setlength(sResponse,64);
IdTCPClient1.ReadBuffer(sResponse[1],64); 以上代码是服务端返回字节是64的时候是可以正常工作的,但是需要写死读取的字节数。如果用线程轮寻的话,可否提供一下示例代码,谢谢
i1:integer;IdTCPClient1.WriteBuffer(str[1],Length(str));i1:=IdTCPClient1.ReadInteger();setlength(sResponse,i1);
IdTCPClient1.ReadBuffer(sResponse[1],i1); 线程轮询代码,只是用来说明问题,很多细节没有处理,用的是indy10
procedure nthread.Execute;
var
RecvCount : integer;
begin
while (True) do
begin
if self.Terminated then exit;
Sleep(1);
try
try
//是否有数据,非阻塞式
RecvCount:=self.IdTCPClient.IOHandler.InputBuffer.Size;
if (RecvCount>0) then
begin
//有数据
//从网络接收数据
with self.IdTCPClient.IOHandler.InputBuffer do
begin
ExtractToBytes(RecvBuffer,RecvCount,false);
end;
//清除缓冲
self.IdTCPClient.IOHandler.InputBuffer.Clear;
end;
except
//错误,跳过发送
Continue;
end;
end;
后来我是这样写的,暂时工作正常,不知道会不会有问题,
IdTCPClient1.WriteBuffer(str[1],Length(str));
IdTCPClient1.ReadFromStack;//加上这句后,下面的IdTCPClient1.InputBuffer.Size才会有值,否则是0,我用的是indy 9,如果是indy10的话不知道是不是就不需要这句了呢
i1 := IdTCPClient1.InputBuffer.Size;
IdTCPClient1.ReadBuffer(sResponse[1],i1);
用ReadBuffer就可以实现
接受端sResponse := IdTCPClient1.ReadLn(enUTF8);
接受端sResponse := IdTCPClient1.ReadLn(enUTF8);