indy阻塞模式

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
 
indy采用的是阻塞模式,如果Server端未返回信息,这个readln会一直等下去,哪个TimeOut不起作用,是个BUG。
后来INDY团队给出的解决办法如下:
第一种:
Change this in last portion of ReadFromStack():
 ...
 until (LByteCount <> 0) or (Connected = False);
 ...
to:
 ...
 until (LByteCount <> 0) or (Connected = False) or (Result
= -1);
 ...
 
第二种:
Current faulty situation in ReadFromStack() at Line 427
(Beta 9.0.3-B):
 ...
 // Timeout
 if ARaiseExceptionOnTimeout then begin
    raise EIdReadTimeout.Create(RSReadTimeout);
 end;
 Result := -1;
 ...
 
Change this to:
 ...
 // Timeout
 Result := -1; // MOVED!
 if ARaiseExceptionOnTimeout then begin
    raise EIdReadTimeout.Create(RSReadTimeout);
 end else // ADDED!
    break; // ADDED!
 ...
 
Indy TIdTCPClient伪非阻塞式的解决方案 Indy是阻塞式Socekt,通过线程的方式,我们可以避免程序被阻塞。 平时在开发中,是直接用的同步模式,在线程中进行一问,一答的交互。但是这就遇到了一个问题,就是服务器没有立马响应,我们的程序就出现readtimeout异常。 这个时候就采用异步阻塞模式。 发送和接受不再是成对的了。 首先连接是服务器: procedure TForm1.btnloginClick( 阅读详情

相关推荐

关于Delphi中Indy控件,TCP通信实时性问题

关于Delphi中Indy控件,TCP通信实时性问题。 Indy的TCP通信,最常采用的是阻塞方式。也就是说,如果是TCP的客户端,需要一个子线程来查询是否有数据到达。服务器端是由IndyServer自己生成一个子线程,然后在子线程中循环调用回调函数(事件),实现事件的响应模式,对使用者来讲,和其他控件的事件响应编程方法一致。 虽然编程方法一致,但是有个问题,就是线程的执行效率的问题。具体的

SS2000的专栏 4190

基于TCP的Socket连接【Delphi版】

基于TCP的Socket连接【Delphi版】 一、Server端 使用的indy控件: idtcpsrvr1: TIdTCPServer; a)设置默认端口 1 begin2 Self.btn1.Enabled:=False;3 idtcpsrvr1.DefaultPort:=2001;4 idtcpsrvr1.Active:=Tr...

weixin_30917213的博客 340

DELPHI超级Internet控件集--INDY

DELPHI超级Internet控件集--INDY 你有没有用DELPHI开发Internet程序?是不是常常会烦恼FastNet组件为什么没有源代码?有很多问题,不看源代码,真不知道是什么问题。是不是也觉得FastNet组件支持的网络协议还不够多?现在不用烦恼了,有一套功能很丰富、使用很方便、开放源代码的免费INTERNET控件集可以解决你的烦恼。这套控件集就是INDY了。  什么是INDY?它

喷喷猪 3003

Delphi Indy和socket的一些区别

关于INDY--DELPHI的Internet控件集 Delphi 2010 中包含了大量的Indy控件,网上找点资料转到博客下面给大家分享下。 你有没有用DELPHI开发Internet程序?是不是常常会烦恼FastNet组件为什么没有源代码?有很多问题,不看源代码,真不知道是什么问题。是不是也觉得FastNet组件支持的网络协议还不够多?现在不用烦恼了,有一套功能很丰富、使用很方便

u013436459的专栏 1195

Delphi各种Socket组件的模式和模型

Delphi各种Socket组件的模式和模型 Delphi的大多数书籍里面都没有提到delphi的各种socket通信组件的模式和模型,有的书只讲解了windows的socket模式和模型,并没有归纳各种组件采用的模型,所以我们的程序员并不知道如何进行选择,只知道某组件好,为什么好,如何运用就不知道了。 笔者对这些组件进行了一个归纳,如下: 组件 单元 ...

weixin_30569001的博客 160

\t\tIndy 的 ReadTimeOut 设置失效?

最近在做MMS彩信接口程序,因为不使用Java平台,运营商所提供的Java版的MMS开发包无用,只好按照通信协议用indy直接连接服务端发送拼装好的数据封包来做处理。为了将自己程序发出的封包和使用java开发包发出的数据包做对比,使用indy做了一个简单的tcpserver来接收发出的封包数据做保存。发现设置的ReadTimeOut设置无效,到了设置的超时时间仍然会处于阻塞状态,只有连接断开才可以

350

indy和socket的一些区别

1. 下面比较一下serverSokcet与clientSocket和idTcpServer与idTcpClient两组通讯组件的异同: socket即支持同部传送数据又支持异步传送数据。而idtcp则只支持同步传送数据。 serverSokcet与clientSocket是非阻塞式的,基于事件触发的。   idTcpServer与idTcpClient是阻塞式的,基于多线

xj82257695的专栏 1642

IDFtp用法

IDFtp用法 1 连接远程服务器procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);2 改变目录procedure ChangeDir(const ADirName: string);...

626

Indy TIdTCPClient 在网络掉线时的处理方法

自己做 TCP 的操作,客户端采用 TIdTCPClient 用起来比较简单。经过测试,这个控件也比较稳定。Indy 的控件都是阻塞模式阻塞模式下,代码比较简单,不容易出现面条代码。 假设 TCP 连接已经建立,正常操作中,网络掉线了,可能过一段时间,网络又恢复了。比如拔掉网线这种情况。 经过测试,发现以下状况。以下描述的情况,在主线程中操作,和在线程中操作,结果一样。 在刚掉线的在几秒...

pcplayer的博客 4519

delphi 文件下载汇总

delphi 文件下载汇总 2011年03月22日   现在很多应用都需要上传与下载大型文件,通过HTTP方式上传大文件有一定的局限性。幸好FTP作为一个非常老而且非常成熟的协议可以高效稳定地完成大文件的上传下载,并且可以完美地实现续传。就拿我写的电影服务器管理端程序来说,各种方案比较后,发现使用FTP可以完美地实现要求。但是要通过WinSocket库实现FTP比较麻烦,幸好有Indy-...

eja49eja 217

用IdTCPServer和IdTCPClient传输文件

以下代码相比网上其它某些文件传输代码精练很多,传输的文件大小任意,个人建议:写网络文件传输程序时最好用Indy的控件(因为其默认即阻塞模式,Server端已封装了多线程,没有数据包大小限制),ClientSocket VS ServerSocket传输文件很麻烦,要自定通信协议,并且有个8KB的瓶颈,实现大文件传输比较麻烦,服务端发送:var iFileHandle:integer;

被遗忘的遐想空间 1323
上一篇: 有关socket确认连接
下一篇: Windows完成端口编程
Devillyd
博客等级 码龄23年 58粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值