Delphi 7中用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的唯一方式,并且它工作得很好。

时间: 2024-10-31 18:20:10

Delphi 7中用Indy组件开发Socket应用程序的相关文章

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

web|程序|组件开发 如果你是一名Active Server Page (ASP) 开发者,相信你可能经常使用COM对象来创建ASP页面.甚至在你使用中都忽略了他就是COM对象.比如:ADO.只个调用率最高的组件已让你的页面扩展了无限的功能.然而ASP本身是解释型脚本,在功能上不足COM强大.作为拥有快速开发,易用性强,支持COM的VB自然的作为了ASP中开发COM的首要工具.下面的示范和描述中,通过Visual Basic 语言在告诉大家如何写COM及COM对象模型的使用,相信会让你有所收获

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

一.慨述 近些年来,随着互联网的普及和推广,传统的单机模式和局域中的c/s模式的应用程序越来越不能满足信息共享的要求.因此,一种新的基于浏览器的b/s的应用程序的开发方式被提了出来.新的开发方案以其客户端的免维护.免配置.程序能根据服务器的信息能够自动更新升级;服务器端多层模式的应有提高处理的效率和安全性越来越被广大的应用程序的开发者所看好.成为应用程序开发的一个新的发展方向.在windows的平台上,人们利用asp来开发服务的显示界面,而用组件来封装商业规则,在各种杂志上利用各种工具进行组件开

利用VFW在Delphi中开发视频捕获程序

摘要:许多关于视频的软件(如视频会议.可视电话等)开发都应用于视频捕获技术.微软为软件开发人员提供了一个专门用于视频捕获的VFW SDK,从而为在Windows系统中实现视频捕获提供了标准的接口,并大大降低了程序的开发难度.由于VFW SDK只有VC和VB版,没有Delphi版,因此需要在Delphi中一一声明DLL中的各个函数和变量.文中详细介绍了如何利用VFW在Delphi中开发视频捕获程序的步骤,同时给出了程序实例. 1 引言 视频捕获与实时处理是目前图像处理系统中最关键的技术之一,能否准

Delphi开发Web Server程序返回图像的方法

Internet/Intranet在九十年代可能是最流行的计算机术语了,不管是计算机行业内的人士还是计算机外的人士,都会使用Internet/Intranet,有的查资料,有的是宣传自己和公司,甚至有许多以前从没有想到用Internet的东西现在也在用Internet来解决, 比如有的程控数字计算机维护用Internet来解决.在这一切应用之中,基于Web Server的应用程序的开发是基本点,但如何开发Web Server的程序呢? Delphi 3是Borland公司1997年推出的可视化.

面向设计的半封装web组件开发(概要版)

一.传统web组件的妄想 目前很多Team和团队都有自己的一套web组件体系,模块化开发,封装良好,上手简单.然后希望该web组件可以应用到接手的各个项目中,节约日后的开发成本.甚至考虑开源. 这其实是很棒的,但是呢,希望一套web组件各个项目通用?在我看来,除非对项目没有追求,否则不太现实. 但是呢,希望一套web组件各个项目通用?在我看来,除非对项目没有追求,否则就是妄想. 为什么说传统web组件想一统天下不现实呢?因为就像秦始皇一统天下一样,要牺牲很多很多东西. 牺牲代码量 web组件要想

基于YUI的组件开发(1)【珍珠奶茶帮】

分享人:拔赤 导语:如今的前端开发越来越OO,也越来越注重重用,娴熟的用js写出OO的前端代码已然是一个前端工程师的基本素质之一.与此同时,网站的开发过程也越来越类似于堆积木.模块思想也逐渐深入的应用在大型网站的开发之中,指导网站的设计和架构,在今天[珍珠奶茶帮]的分享中,我们来对基于YUI的组件开发做深入探讨. 模块化的前端开发 在web技术迅猛发展的今天,大型网站的前端开发越来越依赖复杂的团队配合,而模块化思想则能有效的指导团队开发的效率提升和成本压缩.它使得我们在项目中将注意力放在颗粒化组

J2EE平台WEB组件开发中如何使用定制标签

j2ee|web|组件开发 摘要: J2EE PLATFORM WEB组件开发涉及SERVLET 和JSP技术,SERVLET和JSP各有其优缺点.JVAVABEAN和定制标签对JSP的表示能力提供了很好的扩展,大大提高了JSP的表示能力,同时它们的引入使WEB开发可以很好的进行分工,提高开发效率,降低开发成本,同时提高了JSP页面的可读性.重用性.可维护性.本文将介绍J2EE平台WEB组件开发中如何使用定制标签,主要介绍开发定制标签的意义,原理.步骤.在TOMCAT上的发布并给出一个典型的标签

Flash CS3 组件开发教程

教程|组件开发 [教程说明]:应云开等朋友的要求,我今天把组件开发过程整理一下,写成这篇教程.通过此篇教程你可以大致了解Flash 组件开发整个过程,希望对那些想自己开发Flash 组件的朋友有所帮助.我这次主要开发Flash 代码组件,甚至其他Flash 组件,你可以自行研究或和我一起讨论. [前提条件]:1.安装了Flash CS3软件:2.安装了Adobe Extension Manager 1.8 扩展管理器,如果没有请先到这里下载: [开发教程]:1.首先准备一个18x18的png 图

flash组件开发要点

组件开发 开发组件的目的就是为了封装可以重复使用的应用程序块,减少毫无意义的重复编码工作,提高开发效率. 最近在研究flash8的v2组件整理了一些制作组件的基础知识 1.必须清楚的一些类 Object类是基类,所以其他的类都派生于他.这个类我们需要重点了解reisterClass的用法,这个方法可以将类和元件关联起来,通俗的讲就是将类的一些方法和属性赋给元件对象,这个方法和在库中设置类绑定的作用是一样的. 侦听广播机制和委托机制必须熟悉,这套机制是flash开发大型项目的杀手锏. 2.flas