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

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

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

  9.   

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