郁闷!TIdUDPClient为什么不工作了 ( 积分: 300 )

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

tonmy

Unregistered / Unconfirmed
GUEST, unregistred user!
客户机/服务器程序,客户机用TIdUDPClient,两个线程,一个发,一个收,用于检查客户机/服务器是否处于连接状态,并传送一些数据,服务器用TIdUDPServer,收到客户机的数据后,发回一个应答数据;在服务器关掉后,客户机仍然尝试发和收,以便服务器一起动立即自动连接上,这时问题就出现了:当服务器长时间不开起,客户机程序就莫名其妙的死掉了,只能通过结束任务来关掉客户机程序(注:若服务器一直开起状态时,没发现过问题),查了好久,问题应该出在UDP上,但实在不知道怎么解决,希望高手指点。
其实我做的这个程序,通信上有点像QQ,当线路断开后,仍尝试与服务器进行连接,线路一接通,立即自动显示接通状态。
 
客户机/服务器程序,客户机用TIdUDPClient,两个线程,一个发,一个收,用于检查客户机/服务器是否处于连接状态,并传送一些数据,服务器用TIdUDPServer,收到客户机的数据后,发回一个应答数据;在服务器关掉后,客户机仍然尝试发和收,以便服务器一起动立即自动连接上,这时问题就出现了:当服务器长时间不开起,客户机程序就莫名其妙的死掉了,只能通过结束任务来关掉客户机程序(注:若服务器一直开起状态时,没发现过问题),查了好久,问题应该出在UDP上,但实在不知道怎么解决,希望高手指点。
其实我做的这个程序,通信上有点像QQ,当线路断开后,仍尝试与服务器进行连接,线路一接通,立即自动显示接通状态。
 
如果真要用Indy的UDP,C/S都用TIdUDPServer就行了,它可以响应事件.由于UDP是发送后不管的,不区分客户端和服务器端.
TIdUDPServer的OnUDPRead事件,本身就是个线程,所以如果再创建一个接收线程就多此一举.
 
但是TIdUDPServer对固定端口,在同一台电脑上不能运行多个客户端呀,而我的客户端程序有好几种,要求能同时运行
 
设置好 Timeout 的值, 例如为 6000 试试。

其实indy 的东西 不好用, 有些莫名其妙的问题, 例如在 win98下收不到 广播。我感觉到Indy 已经到了尽头了, 没有人维护。
 
不是死掉了。而是没有连接上服务器端,你必须等待一段时间程序才能响应。如果碰到是这样的话,那是没有办法的。你服务器程序都不开,如何客户能连接的上。。
 
问题还是一样呀,怎么办?
To:zzjmail
我就是要服务端关闭的情况下还,客户端还一直在尝试连接,这样,服务端一打开,就可以立即连接上了。
 
那是没有办法的。没有响应,那是你的这个连接服务器的线程还在连接,没有结束。你可以控制一下时间。如果一段时间没有响应,那就是服务器没有开,或者是网络有问题,此时你就应该关闭连接的线程。等一下再连接。。。。这个是提供一下思路。。呵呵,俺也没有做过
 
用两对就好解决问题了。服务端:TIdUDPServer,TIdUDPClient。
客户端:TIdUDPServer,TIdUDPClient。
 
服务端的TIdUDPServer对客户端的TIdUDPClient。
服务端的TIdUDPClient对客户端的TIdUDPServer。
收,发,判断。畅通无阻
 
To: 子瑜
你的办法我也曾经想过,但对同一端口,包含TIdUDPServer的程序在一台电脑上只能运行一个,我要在同一台电脑上运行多个客户端程序,怎么办?
 
为什么要用TIdUDPServer 呢
UDP SOCKET 自己写很简单 又不要考虑多路复用等问题
 
TIdUDPServer 只有在 ACTIVE:=TRUE 时才占用端口,TIdUDPClient 会自己去找没有用过
的端口,用子瑜有方法,然后用TIdUDPServer代替了TIdUDPClient端口进行收发就行了。当
然代替之前 TIdUDPClient 的 ACTIVE 一定要 FALSE.
 
TO: redsky.l
用TIdUDPServer代替TIdUDPClient的话,在一台电脑上同一时间也只能运行一个客户端呀!!!
QQ的通信是怎么做的呀?谁知道??
 
为什么不用TCP呢?客户端用个TIMER定时发起连接
 
现在客户端改为TIdUDPServer了,端口为动态改变,只有发的线程,200ms发一次,
这样之后,没发现客户端死掉的情况,但是有时候发现"Socket Error #10038, Socket operation on Non-socket"的错误,有时错误为"Thread read error",这时打开服务端,也能正常连接上,现在的问题是怎么忽略这些错误提示对话框?
 
Socket.Error中ErrorCode:=0;
 
最近老上不了大富翁!大家久等了。

To: howardyin
TIdUDPServer 没有OnError事件!

现又发现服务器有时会有错误Socket error #10054 Connection reset by peer,
而该错误没有弹出任何提示对话框(我已去掉所有Try...Except,仍然如如),只在Delphi中运行时才能发现。已一但产生这个错误,服务器端的IdUDPServer就不能再接收到任何客户端发过来的信息,这是怎么回事呀!
 
TIdUDPClient一般情况下没用

用TIdUDPServer即可
 
当服务端有别的程序占用CPU一段时间后,服务端的UDPServer会产生错误: Socket error #10054 Connection reset by peer,这个错误捕捉不到,也没有任何提示消息框,出现这个错误之后,服务端的UDPServer就不能接收客户端发过来的消息了,服务端的UDPServer必须断开再重新连接,才能恢复通信,可是没法知道什么时候产生了这样的错误,怎么办?
解决这个问题后,立即发分。
 
后退
顶部