IdTCPServer如何段开和客户端的连接

1、请问IdTCPServer如何段开和客户端的连接,现在有我写了一个SERVER端和一Client端程序,当Client先段开与SERVER的连接,SERVER再停掉服务没有问题,但是当Client没有段开连接而SERVER直接关闭服务就会报异常,我想在关闭SERVER前先关掉所有客户端的连接,试了很长时间都没有成功,请问怎么解决。SERVER用的是IdTCPServer,Client用的是IdTCPClient控件。  
   
  2、还有一个小问题,IdTCPServer好象本身就是多线程的,我是不是就不用在为每个连接写个线程了,我看到一些文章提到要用线程池,它是做什么用的,怎么用,为什么用,不用行不行,(第一个问题是最最急的,请先帮我解决第一个,多谢多谢。)。 问题点数:20、回复次数:11Top

<script language="javascript" src="/js/banner_comm.js" type="text/javascript"></script>  

1 楼coffee36(咖啡)回复于 2005-10-24 09:16:48 得分 0

这个问题我也遇到过,查了好几天的资料也没有解决。最后干脆用TSERVERSOCKET实现了。  
  1   当时查资料时说是服务器先关闭时确实回出现异常,也有人说这是INDY的一个BUG。不过没查到解决办法。  
  2   INDY本身就是多线程的,它有一个监听线程专门负责监听来自客户端的请求,并为每个客户端建立一个服务线程,Top

2 楼qtercel(嗷嗷)回复于 2005-10-24 11:26:46 得分 0

难道说就没有什么好办法解决,我这里现在不能用D5的SOCKET控件,那组控件是可以实现,但是公司选择了现在INDY控件,所以换控件是不可能的,有没有什么好的办法。我自己建立了一个线程的队列,是想用来管理线程的,如果说不能关闭,那这个线程队列也就没什么用了。你们在用这套控件的时候,这种情况是怎么处理的。Top

3 楼cjf1009(农民程序员)回复于 2005-10-24 11:54:03 得分 0

1、正常退出的原则是:客户端发退出信号,并退出---服务器接到退出信号,断开连接。当关闭服务器时,可以先发送一个退出命令给客户端,客户端执行上述操作。最后再关闭服务器。  
  2、不用再建立线程了。  
  Top

4 楼clasj(★知我☆)回复于 2005-10-24 13:09:38 得分 0

有异常怕什么,捕获掉就可以了!  
  楼上的方法在server正常退出的时候可能还有效,万一它异常退出呢,那还来的急发东东吗?Top

5 楼qtercel(嗷嗷)回复于 2005-10-24 13:42:29 得分 0

请问IdTCPServer如何主动去呼叫IdTCPClient,IdTCPServer有一个事件是OnExecute,当客户端发送消息的时候,这个事件被自动触发,这时SERVER可以回复Client,这都在程序设计的时候自己来根据情况设计的,但是要让IdTCPServer先主动给IdTCPClient发消息,IdTCPClient在什么地方接收,我总不能单独写个线程一直再那里READLN()来等待服务器的呼叫,INDY这组控件不像以前的SOCKET那套控件。请问什么高招。Top

6 楼qtercel(嗷嗷)回复于 2005-10-25 08:52:20 得分 0

问题仍然没解决。Top

7 楼piao9wu(飘麟霄骥)回复于 2005-10-25 10:08:39 得分 0

1。IdTCPClient发送一个(特定命令)给IdTCPServer,当然并不是关闭的命令,当IdTCPServer  
  收到这个(特定命令),就给IdTCPClient发送关闭命令。Top

8 楼qtercel(嗷嗷)回复于 2005-10-25 11:39:56 得分 0

TO   piao9wu(飘麟霄骥)   :那直接在客户端关闭不就得了,现在是服务器先关闭,客户端怎么知道服务器什么时候关闭呢,如果知道,就不用在给服务器发命令了,我直接关闭客户端就可以了。Top

9 楼piao9wu(飘麟霄骥)回复于 2005-10-25 15:29:06 得分 10

1。IdTCPClient发送一个(特定命令)给IdTCPServer,当然并不是关闭的命令,当IdTCPServer  
  收到这个(特定命令),就给IdTCPClient发送关闭命令。  
  ///  
  楼主,你可能没有明白  
   
  最后是IdTCPServer发送给IdTCPClient一个关闭命令,是让IdTCPClient它先关闭,明白吗  
   
  客户端try   一下,如果没有返回消息,则再关闭服务端  
   
  你不是,就要这样的功能的吗  
   
  Top

10 楼qtercel(嗷嗷)回复于 2005-10-27 12:29:55 得分 0

TO   piao9wu(飘麟霄骥)我明白你的意思,但是客户端在什么地方接收,IdTCPClient不像IdTCPServer那样,有消息过来可以自动触发,难道是要单独启一个线程来不停地READLN(),这样是可以实现,但是READLN后IdTCPServer必须给他WRITELN,否则IdTCPClient将一直等在那里,别的什么都不能做了,你有什么方法能解决这个问题。或许你的你意思是SERVER和CLIENT之间不停地来回通讯,直到CLIENT收到SERVER的关闭没,命令后CLIENT再退出连接。Top

11 楼cjf1009(农民程序员)回复于 2005-10-27 15:36:59 得分 10

IdTCPClient在什么地方接收,我总不能单独写个线程一直再那里READLN()来等待服务器的呼叫  
  **************************************  
  呵呵,你说对了,IdTCPClient就是这样接收的。  
   
  其实之所以出错,是线程不能正常退出的原因。而INDY是阻塞的,服务器端的readln是线程里的代码,又一直停在那里,服务器直接退出的话,线程不能正常退出,所以出错。  
  所以,在server的线程里接收,要先判断线程是不是退出或连接是否成功,即  
  while   not   terminate   or   IdTCPClient.Connected=ture   do  
  begin  
  //接收代码  
  end;  
   
  楼主要好好研究一下线程的东西。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值