*********** 关于indy的 TidTcpClient 使用上的一个技巧问题,大家都会碰到. **************** (100分)

  • 主题发起人 主题发起人 liboy.com
  • 开始时间 开始时间
L

liboy.com

Unregistered / Unconfirmed
GUEST, unregistred user!
打个比方,要做聊天程序,服务器端要不断的将聊天信息发到每个客户端,而且需要
解答客户端发来的数学题

====================================================================
看下面的客户端代码

通过时钟控件的执行,不断的将服务器发来的信息显示到聊天信息框里
procedure TForm1.Timer1Timer(Sender: TObject);
var Msg : String;
begin
Msg := IdTCPClient1.ReadLn('', 5); //5毫米读一次,为空则退出
memo1.Lines.Add(Msg);
end;

计算函数,客户端发出请求,服务器回答结果.
function TForm1.Calc(): String;
begin
IdTCPClient1.writeln( '1+1=' );
Result := IdTCPClient1.ReadLn; <<<<<问题所在,有可能返回的是聊天的信息
end;

问题是: 客户端单独执行两段代码都没有问题
如何能够同时执行两段代码而不相冲突呢?
请问大家有没有好的思路?
 
发送的信息前面加上调用类别的信息,跟据类别信息处理相应的代码。
 
>>TO 远帆,发送的信息前面加上调用类别的信息,跟据类别信息处理相应的代码。

CALC是一个函数调用,需要实时返回结果.

 
好像不冲突么!
比如用'C$'表示返回的是计算结果:
function TForm1.Calc(): String;
var
Ans:string;
AnsEd:boolean;
begin
IdTCPClient1.writeln( '1+1=' );
AnsEd:=false;
repeat
ans:= IdTCPClient1.ReadLn;
if copy(ans,1,2)='C$' then
begin
result:=copy(ans,3,1024);
ansed:=true;
end
else
memo1.line.add(ans);
until ansed;
end;
 
但是有一种情况,比如说.

client 发送要下载文件请求.
server 端先返回一个字符串数字,表明stream的大小,接着再返回缓冲区内容.

照理说 client 端是应该先 readLn读到缓冲区大小, 再ReadStream接收缓冲区.

问题是,如果读到大小之后,收到的是聊天信息,而不是stream呢?



 
我不太会indy的那些组件,用起来很别扭。
我不知道下载流的代码是如何的。区分应该不难。
实在不行,流的传送可以另外使用一个端口。
 
可以不讨论实际代码,解决思路就行了.我希望只用一个端口
 
好,那你先说读流的代码会不会出取到字符串?流在传输过程中还有可能被插入字符串吗?
知道这两个问题的答案,我想处理方法与上面说的相同。
 
很简单,每个返回字符串前面加一个标识,比如:
C:表示计算结果
M:表示消息
 
>好,那你先说读流的代码会不会出取到字符串?流在传输过程中还有可能被插入字符串吗?
>知道这两个问题的答案,我想处理方法与上面说的相同。

服务器有两个处理进程,
一个是传文件,先传大小,再传缓冲区内容
一个是聊天程序,会不断的传信息给你......
作为客户端,没有办法保证再接收文件的时候,不接收聊天信息..... [:D]
 
怎么又是接受字符信息?纯粹是垃圾代码!要用接受2进制码的函数readbuffer!
采用传输接收纪录的方法,一点也不困难!
 
to: masm
楼主只是新手而已,不至于要这样痛骂嘛。
其实用字符也就是ascii的方式进行传输,并不算垃圾啊
字符方式还是有它的优点的,要不然html、xml之类的会这么流行啊
 
TO masm:
用不用字符方式只是一种手段,能不能解决问题才是关键.我是指针对
indy方式下的传输.
一边不断的读取服务器发来的聊天信息,
另一边则有目的的请求-回应.
 
********************************************************
indy在接收stream的时候,如何读出流的 SIZE ?
 
流就是一块内存而已,对于TCP来说如果不事先知道大小,是无法知道要接受多少数据的
建议先把后来的数据大小传过去,然后再传数据。
 
在workbegin事件参数中有一个integer参数 AWorkCountMax,有时有用,但在传送一个大文件时
却不能返回大小。请高手赐教
 
多人接受答案了。
 
后退
顶部