IdTCPServer如何段开和客户端的连接
  HJwyUgQ6jyHT 2024年08月09日 64 0

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>  

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

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

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

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

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

问题仍然没解决。Top

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

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

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

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

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年08月09日 0

暂无评论

推荐阅读
  7jPfnBIFtnum   2024年08月02日   52   0   0 缓存服务器
HJwyUgQ6jyHT