关于IdTcpClient的ReadLn控件是否有BUG |
尚未結案
|
jackalan
初階會員 發表:20 回覆:88 積分:36 註冊:2003-11-08 發送簡訊給我 |
我使用线程或TIMER循环读取ReadLn格式如下: 包含在线程或TIMER中
STRCMD:=MyidTcpClient.ReadLn(''); 工作很正常,服务器发送来的消息也能够正常接收到,但就
这个程序在运行10~15分钟后就会出现一个非法操作,大意
是IDTCPCLIENT非法操作,不知道循环读取ReadLn是否会占用
什么系统资源,或者IDTCPCLIENT是否有什么缓冲区,不然为
什么短时间没有任何问题,时间长了就出现问题了。 该问题困扰了我好长的时间,因为整个程序全部完成,工作很
正常,就是客户端开的时间长了TCPCLIENT就会报错。请有识之
士能够指点迷经,不胜感激!
|
jackalan
初階會員 發表:20 回覆:88 積分:36 註冊:2003-11-08 發送簡訊給我 |
|
jackalan
初階會員 發表:20 回覆:88 積分:36 註冊:2003-11-08 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
我才被这个问题给弄死掉一阵子。。。。
大概的原因有两个,一个是idTCPServer会将闲置过久的连线给中断,那client端就会发生Disconnect by Peer的问题...解决的方法就是Client端放个Timer,固定10秒钟发送一个持续连线的信息给Server端,服务器受到信息也用不着处理,只要让idTCPServer认为连接仍在活动就好,这样就不会有事了,我测试过,如果不用这种手段,Server大约10分钟就会idle Disconnect处理,如果用了这方法,连线七天七夜也不会断线。 还有,idTCPClient的Readln并不会检查TCPIP的Buffer缓存里是不是有内容,如果Server端没发信息,而Client端还Readln的话,便会出现AccessViolation的问题,我的解决方法
procedure timer.ontimer................. var temp:string; begin idtcpclient.readfromstack(false,1,false); while idtcpclient.InputBuffer.Size>0 do begin temp:=idtcpclient.ReadLn; end; end;这样便不会报错。。。。。。 藏私の禁止 |
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
jackalan
初階會員 發表:20 回覆:88 積分:36 註冊:2003-11-08 發送簡訊給我 |
谢谢japhenchen的精彩回答,我要是早看到就好了,在没看到前我是这样解决的,服务端使用INDYSERVER,但客户端使用TCLIENTSOCKET,呵呵,没想到这两个控件配合效果很好,japhenchen兄你通过判断idtcpclient.InputBuffer.Size>0 的方法我也试过,这样在服务器没有信息传来的时候不会出任何问题,但如果服务器不断发送信息回来问题就又出现了,估计INDY的问题挺大的,其实我个人认为INDY的SERVER很好,但CLIENT就不行了,建议大家使用INDYSERVER和TCLIENTSOCKET的组合。
另外提个醒,TCLIENTSOCKET发送SENDTEXT时由于使用BUFFER发送,BUFFER长度使用的是INTEGER型所以大家注意发送内容的长度,不要大于INTEGER的最大值,超过了分段发就好了。
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
|
jackalan
初階會員 發表:20 回覆:88 積分:36 註冊:2003-11-08 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |