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