(300分)indy的tcpserver问题,高手请(300分)

  • 主题发起人 t1antang
  • 开始时间
T

t1antang

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做一个程序使用tcpserver从一个缓冲池取数据,然后发送给客户端,当数据库的读readenable布尔值为真时就,发送,我将函数readbuffer写在了tcpServerExecute里。但是发现只有当tcpServer从客户端接受到数据时,readbuffer才会执行。不用新开线程的话,我如何才能确保缓冲中一有数据就会发送,而不用等客户端有数据发送时才能运行呢?
 
冒险一点,在tcpServerExecute里采用循环,但要注意内存、连接断线问题,这样的话就可以按照你的意思去处理,另外,你采用timer控件,定时查询也可以。
 
jamcky,多谢,timer确实可以,但是在tcpServerExecute里采用循环,这不是个好办法,这可能会造成通讯的中断。
如何利用tcpServer自身的东西来实现呢?
tcpServer的几个事件我还不是很明白。
我写一个程序,
var i:integer
i:=0;

procedure TfrmMain.tcpServerExecute(AThread: TIdPeerThread);
begin
edit1.text:=inttostr(i);
inc(i);
sleep(1000);
end;
我这样执行后 edit1.text一直在刷新,为什么我放在我写好的程序里,tcpServerExecute没有数据接收时反而不执行了呢?
我想搞清楚这是为什么?
 
我在公司没有delphi环境,只有cbuilder,在cbuilder里面是可以实现循环的,不过,当网络断开时,内存会出现问题,需要人工干预。我记得在delphi里面onexecute事件是在TIdPeerThread.Run触发的时候才执行的,也就是有网络信息才执行。具体的我只能回到家里才能够测试。
 
sleep(1000);
这样不对,tcpserver在delphi 中是线称堵塞模式,在没有数据时处于堵塞下,tcpServerExecute 是接数据用的,你可以自己写个线称判断数据库数据是否满足,然后做个链表吧 AThread: TIdPeerThread 用户连接保存,在符合条件下取出连接判断是否连接正长,然后给每个连接发数据信息。tcpServerExecute 只是接收信息时使用的,这个就是一般多可户长连接的处理方式AThread.Connection.WriteBuffer()
 
多谢两位大侠,看得出两位都是高手,我新学indy,是参照他的demo学得,tcpServerListenException,tcpServerException,IdTCPServer1Status是干嘛用的啊?
demo中我没找到例子,
我再加100分。
想搞明白tcpServer啊。
 
这个你到不用了解,只是一般的TForm1.IdTCPServer1Disconnect ,TForm1.IdTCPServer1Connect,TForm1.IdTCPServer1Execute 长用的就是这几个IdTCPServer1,就是监听相成 里面用tlist管理 AThread 连接线称,一般的就是连接 接收数据 连接断开,这几个,其他的都不实用。
 
IdTCPServer1 使用比较方便 对于大型系统处理效率不高,看看。iocp 处理模式 和地层的网络部分对理解 IdTCPServer1 很有帮助
 
你可以对已经连接上的用户定一个线程列表

在定时器中循环对这个线程列表发送数据,这样就可以达到你的要求了
 
那我在主线程中有没有办法激活IdTCPServer的事件呢?就是在IdTCPServer的事件外对IdTCPServer的事件调用?
另外期待jamcky的答案。

这个问题如果能够不用线程和timer解决,而依靠IdTCPServer自身的线程类解决,不知道能不能解决呢?
 
用多线程加消息。
 
说了半天白说了:郁闷 ,自己看书吧
 
从一个缓冲池取数据,然后发送给客户端,当数据库的读readenable布尔值为真时就发送.
你这里有事件触发吗?如果有,这里触发的时候就可以发的。
另外,我这几天使用在客户端和服务端都使用idupdserver来进行信息交换,觉得很方便。
如果刚才我问你的可以触发,那么你使用在客户端和服务端都使用idupdserver,这样不需要在客户端和服务端建立一个连接并维持这个连接。
使用tcpserver的时候,如果建立连接了程序退出时没有断掉,总提出出错,我觉得很烦。
 
indy的onexecute事件是不停触发的,但如果你在该脚本中有读的操作的话,他就会阻塞等待读的内容返回,这可能就是你的程序无法检验状态的原因吧,如果你要强行这样做,也有办法,就是readenable状态为真时才进入操作,否则就退出onexecute事件,这样,onexecute就会不停的被触发,当满足你的readenable真条件时,你才去读写操作。如果不是,你把程序贴出来看看。
 
感谢大家,这两天明白了不少,尤其感谢jamcky和delphfans两位大侠。
delphfans大哥,多谢你的提示。
 
多人接受答案了。
 

Similar threads

顶部