IndyTcpServer不断的读取客户端的数据? ( 积分: 50 )

  • 主题发起人 主题发起人 spary123
  • 开始时间 开始时间
S

spary123

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端发送数据的频率为1分钟一次(50秒)
我在服务器端想不断的读取客户端发送的数据怎么做?感谢
 
不是很理解你的意思。这样的传输频率,你保持连接,客户端不停发不就可以?服务端不是会触发接收 ?
 
1楼的兄弟,你这样做,未免频率也太快了,不怕你程序崩溃
 
在服务端的onExecute事件写
RDLN := AThread.Connection.ReadLn;
就能把客户发过来的字符串接收下来。每发一条过来都触发一次这个事件。就会开一个线程来处理。所以没什么大问题.
个人理解,IDTCPSERVER和IDTCPCLIENT工作原理不同。SERVER是主动发,被动收;CLIENT是主动发,主动收。有消息到SERVER的指定IP和端口后能触发onExecute事件,触发后再去处理就行了。
 
我再想问几个问题:
1是不是每次建立连接后程序自动创建一个线程,一个客户端只建立一个线程,然后每收到一次数据后自动触发ONExecute事件(由这个线程处理)?
2收到数据后由线程的readbuffer从INDY buffer中读取数据吗?读取出数据到指定位置后,INDY BUFFER中的数据是自动删除吗?下一次readbuffer就读取接下来的一个BUFFER单元,是这样吗?
3我要把客户端发给我的数据全部读出来,要不要判断缓冲区是否为空,若是,怎么判断。
4我要收发的数据是一个在应用层定义的数据结构体(长度不确定)。我可以一个字段一个字段的读取吗(类型确定有Tdatetime,integer,我知道结构体的读取顺序)?
感谢,分不够我再加
 
1是不是每次建立连接后程序自动创建一个线程,一个客户端只建立一个线程,然后每收到一次数据后自动触发ONExecute事件(由这个线程处理)?

这个问题有两问,第一问,是否客户端连接就建立个线程,答案是肯定的;第二问,每收到消息就执行一次OnExecute,并非如此,整个OnExecute都是在不间断运行的,实际上是在一个wile里面不停循环,但是在一个OnExecute事件里面,你可以收N次数据(期间可以发N次数据),没有你说的接受一次触发OnExecute这样的情况,实际上OnExecute不管有没有数据来都在不停的Runing中。

2收到数据后由线程的readbuffer从INDY buffer中读取数据吗?读取出数据到指定位置后,INDY BUFFER中的数据是自动删除吗?下一次readbuffer就读取接下来的一个BUFFER单元,是这样吗?

这取决于你用的Indy组建的版本,目前我用的是Indy10最新Snapshot版本,数据的读写都交给了TIOHanlder处理,这个类和Indy其他组建使用的是Stratagy模式。它既能累加读取你发送来的数据,也能灵活使用数据头+数据体的方式读取(甚至你可以随意清空读来的Buffer,这个Buffer都能用IOHanlder的相关方法控制的,参看TIdIOHanlder.InputBuffer的说明)。

3我要把客户端发给我的数据全部读出来,要不要判断缓冲区是否为空,若是,怎么判断。

可以判断if IdContext.IOHanlder.InputBuffer.IsBufferEmpty then,不过之前你需要调用IdContext.IOHanlder.CheckDataFromSource来检测是否有数据到达。

4我要收发的数据是一个在应用层定义的数据结构体(长度不确定)。我可以一个字段一个字段的读取吗(类型确定有Tdatetime,integer,我知道结构体的读取顺序)?

读取变长数据并不困难,只需首先发送一个固定长度的Header,在Header里面指定Data数据的类型和长度即可。

综上所述,你的问题用Indy都可以解决,请参考一下Indy自己的例子和Indy的帮助。如果需要Indy的Snapshot版本,请去2ccc.com下载(这是我搜集上传到2ccc.com上的),如果需要最新的Snapshot版本,请去Indy官网下载。
 
第二个问题我还不明白,我用的是INDY 9(DELPHI7)。
1readbuffer一个数据后的这个数据被从INDY BUFFER中删除吗,那么下一次我再用readbuffer时就读下一个数据了吧?
2如果1是这样的话,我要收一个结构体类型数据,第一个INT型为数据标志OXFFFFFFFF,第二个为数据长度也为一个INT型,之后为数据内容。
我首先要读地一个INT型4字节为开始标志,判断是否为OXFFFFFFFF;然后再读取下一个INT型即长度。可以这样吗?
if AThread.Connection.ReadCardinal = $ffffffff then
begin
ipdatalength:= AThread.Connection.ReadInteger(true);
readbuffer(user_record,ipdatlength-8);//user_record为自定义数据
......
{var
user_record : Tvector_all;
Tvector_all= record
time : Tdatetime;
datasort : integer;
........
end;}
3上述readbuffer(user_record,ipdatlength-8);这个涉及网络 字节顺序和本机字节顺序的转换吗?
 
后退
顶部