用Indy组件开发Socket应用程序

颐萱格格

颐萱格格

2016-01-29 14:28

用Indy组件开发Socket应用程序,用Indy组件开发Socket应用程序
  笔者在前一段的工作中,需要开发一套简单的网络数据传输程序。由于平时常用Delphi做点开发,故此次也不例外。Delphi 7中带有两套TCP Socket组件:Indy Socket组件(IdTCPClient和IdTCPServer)和Delphi原生的TCP Socket组件(ClientSocket和ServerSocket)。但是,Borland已宣称ClientSocket和ServerSocket组件即将被废弃,建议用相应的Indy组件来代替。因此,笔者使用了Indy。本文在对Indy进行简要介绍的基础上,创建了一组简单的TCP Socket数据传输应用来演示了Indy的使用方法。

  开放源代码的Internet组件集——Internet Direct(Indy)Internet Direct(Indy)是一组开放源代码的Internet组件,涵盖了几乎所有流行的Internet协议。Indy用Delphi编写,被包含在Delphi 6,Kylix 1和C++ Builder 6及以上各个版本的Borland开发环境中。Indy曾经叫做WinShoes(双关于WinSock——Windows的Socket库),是由Chad Z. Hower领导的一群开发者构建的,可以从Indy的站点www.nevrona.com/indy上找到更多的信息并下载其新版本。到笔者撰写本文时为止,Indy的最新稳定版是9.0.14,Indy 10也进入了Beta测试阶段。

  Delphi 7中所带的是Indy 9。在其的组件面板上,一共安装有100多个Indy组件。使用这些组件你可以开发基于各种协议的TCP客户和服务器应用程序,并处理相关的编码和安全问题。你可以通过前缀Id来识别Indy组件。

  Indy是阻塞式(Blocking)的

  当你使用Winsock开发网络应用程序时,从Socket中读取数据或者向Socket写入数据都是异步发生的,这样就不会阻断程序中其它代码的执行。在收到数据时,Winsock会向应用程序发送相应的消息。这种访问方式被称作非阻塞式连接,它要求你对事件作出响应,设置状态机,并通常还需要一个等待循环。

  与通常的Winsock编程方法不同的是,Indy使用了阻塞式Socket调用方式。阻塞式访问更像是文件存取。当你读取数据,或是写入数据时,读取和写入函数将一直等到相应的操作完成后才返回。比如说,发起网络连接只需调用Connect方法并等待它返回,如果该方法执行成功,在结束时就直接返回,如果未能成功执行,则会抛出相应的异常。同文件访问不同的是,Socket调用可能会需要更长的时间,因为要读写的数据可能不会立即就能准备好(在很大程度上依赖于网络带宽)。

  阻塞式Socket并非恶魔(Evil

  长期以来,阻塞式Socket都遭到了毫无理由的攻击。其实阻塞式Socket并非如通常所说的那样可怕。这还要从Winsock的发展说起。

  当Socket被从Unix移植到Windows时,一个严重的问题立即就出现了。Unix支持fork,客户程序和服务器都能够fork新的进程,并启动这些进程,从而能够很方便地使用阻塞式Socket。而Windows 3.x既不支持fork也不支持多线程,当使用阻塞式Socket时,用户界面就会被“锁住”而无法响应用户输入。

  为克服Windows 3.x的这一缺陷,微软在Winsock中加入了异步扩展,以使Winsock不会“锁住”应用程序的主线程(也是唯一的线程)。然而,这需要了一种完全不同的编程方式。于是有些人为了掩饰这一弱点,就开始强烈地诽谤阻塞式Socket。

  当Win32出现的时候,它能够很好地支持线程。但是既成的观念已经很难更改,并且说出去的话也无法收回,因此对阻塞式Socket的诽谤继续存在着。

  事实上,阻塞式Socket仍然是Unix实现Socket的唯一方式,并且它工作得很好。

  阻塞式Socket的优点

  归结起来,在Windows上使用阻塞式Socket开发应用程序具有如下优点:

  编程简单——阻塞式Socket应用程序很容易编写。所有的用户代码都写在同一个地方,并且顺序执行。
容易向Unix移植——由于Unix也使用阻塞式Socket,编写可移植的代码就变得比较容易。Indy就是利用这一点来实现其多平台支持而又单一源代码的设计。

  很好地利用了线程技术——阻塞式Socket是顺序执行的,其固有的封装特性使得它能够很容易地使用到线程中。

  阻塞式Socket的缺点

  事物都具有两面性,阻塞式Socket也不例外。它的一个主要的缺点就是使客户程序的用户界面“冻结”。当在程序的主线程中进行阻塞式Socket调用时,由于要等待Socket调用完成并返回,这段时间就不能处理用户界面消息,使得Update、Repaint以及其它消息得不到及时响应,从而导致用户界面被“冻结”。


展开更多 50%)
分享

猜你喜欢

用Indy组件开发Socket应用程序

Delphi
用Indy组件开发Socket应用程序

Delphi开发WEB应用程序打印组件

Delphi
Delphi开发WEB应用程序打印组件

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

用JBuilderX开发WEB应用程序

编程语言 网络编程
用JBuilderX开发WEB应用程序

在ASP中利用COM组件开发Web应用程序

ASP
在ASP中利用COM组件开发Web应用程序

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

教你用ajax开发web应用程序

Web开发
教你用ajax开发web应用程序

用JSTL实现JSP应用程序快速开发

Java JAVA基础
用JSTL实现JSP应用程序快速开发

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

实时抓取YAHOO股票报价的代码

实时抓取YAHOO股票报价的代码

简析Delphi中的XML编程

简析Delphi中的XML编程
下拉加载更多内容 ↓