1. 络编程概述
随着 络技术的不断发展,特别是 Internet 的迅速发展,业务系统在互联 上也逐步完善,传统的应用也在向分布式应用逐步转变。尤其是物联 、边缘计算等技术的发展,对传统 C/S 应用在 络编程方面要求越来越高。Delphi 在 络编程方面具有独特的优势,其可视化、丰富的封装组件大大简化了程序员的开发工作,使得 络编程非常直观、高效。
Delphi 在 络编程方面内容相当丰富,包括 络协议体系结构、TCP/IP协议、基于 Web 的应用结构等方面,并且可以结合多线程、动态链接库及高级组件技术等进行开发。
本章主要介绍套接字 (Socket) 编程、电子邮件客户端、Http 协议方面的编程知识。本节主要介绍套接字 (Socket) 基础。
1.1 TCP、UDP 和 IP
首先,我们来了解一下 OSI 7 层模型。如下图所示:
TCP 和 UDP 处于传输层协议,而 IP 处于 络层。
TCP 是传输控制协议, 是一种面向连接的、可靠的、基于字节流的传输层通信协议。提供可靠的全双工的字节流。TCP 关心确认、超时、重传等具体细节。
UDP 是用户数据 协议,是一种无连接协议。UDP是一种简单的、不可靠的数据 协议,与 TCP 不同的是,UDP 不能保证每个 UDP 数据 可以到达目的地。 UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
IP 是 际协议,Internet Protocol的缩写,是 TCP/IP 体系中的 络层协议。设计 IP 的目的是提高 络的可扩展性:一是解决互联 问题,实现大规模、异构 络的互联互通;二是分割顶层 络应用和底层 络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。
1.2 套接字(Socket)
套接字(Scocket)是两台机器通信的终结点,在它们的后面即为使用 络协议进行通信的程序。Socket 与其他 I/O 设备类似,对它的操作包括打开、读取、写入及关闭等操作。
套接字(Socket)的概念最初由加利福尼亚 Berkeley 学院为 BSD UNIX 操作系统开发的 络通信接口,能够访问多种 络协议。随着 UNIX 操作系统的广泛使用,套接字称为当前流行的 络通信应用程序的接口之一。但 Berkeley Socket 只能用于 UNIX 操作系统,随着微软的操作系统的日益推广,20世纪90年代初,由 Microsoft、Sun Microsystem 等几家公司共同参与制定了 Windows Sockets 规范。1993 年,制订了 Windows Sockets 1.1规范,1997年5月,WinSock2 的正式规范版本 2.2.1 发布。
1.3 面向连接和无连接
一般情况下,一个通信协议提供面向连接的服务或者提供无连接的服务。
在面向连接的服务中,两台机器进行数据交换之前,通信双方需要建立一条用以进行通信的路径。从而确定了通信双方之间的联系,可以保证通信双方都处于活动状态,并且可以彼此响应。一般情况下,面向连接的协议可以保证传输数据的可靠性。TCP 就是一种面向连接的协议。应用程序利用 TCP 进行通信时,双方会建立一个连接,通过这一连接双方可以把数据当作一个双向的字节流进行交换。
无连接服务则不管目标方是否处于待接收状态,源方只管将信息发送给目的方,同时也不管目标方是否已经收到该信息,以及接收到的信息是否正确等。UDP 就是一种无连接的协议,数据传输方法采用的是数据 。
这两种服务方式各有优缺点:
1.4 套接字类型
TCP/IP 的 Socket 提供了三种类型的套接字:
流式套接字提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限制;数据被看作字节流,无长度限制,可以双向传输。文件传送协议 FTP 使用的就是流式套接字。
提供一个无连接服务,数据包以独立包形式被发送,不提供无错保证,数据可以丢失或重复,并且接收顺序混乱。也就是说,一个建立在数据 套接字上所接收的信息可能重复、或者和发出时的顺序不同。
原始套接字允许对较低层的协议,如 IP、ICMP 直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。目前,只有 WinSock 2 提供对它的支持。
在实践项目开发中,在使用 Delphi 开发 络应用程序时,通常不直接使用 WinSock,包括对 Internet 组件面板上的 TClientSocket 和 TServerSocket 组件也不提倡使用。同时,随着我国国产化的不断推进,渐渐地我们需要在 Linux 内核操作系统下进行软件开发,在开发工具方面可能 Lazarus、CodeTyphon 会使用得更多一些,在 络编程方面,Indy 组件包可能是更好的选择。
1.5 客户/服务器模式
在 TCP/IP 络应用程序中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server Modal),即客户向服务器发出服务请求,服务器收到请求后,提供相应的服务。客户/服务器模式在操作过程中采取的是主动请求方式。
首先服务端要先启动,并根据请求提供服务。
- 打开一通信信道并通知主机在某一公认的端口上(如 FTP 为 21)接收客户端请求
- 等待客户请求到达该端口
- 接收到重复服务请求,处理该请求并发送应答信息;接收到并发服务请求,则激活一新进程来处理客户请求,新进程处理该客户请求,并不需要对其他请求作出应答。服务完成后终止该新进程与客户的通信链路。
- 返回到 2 ,等待另一个客户请求
- 关闭服务器
客户端:
- 打开一通信信道,并连接到服务器所在主机的特定端口
- 向服务器发送服务请求 文,等待并接收应答
- 继续提出请求
- 请求结束后关闭并终止通信信道
从上面的描述可知:
- 客户与服务器进程的作用是非对称的,因此编码不同。
- 服务进程一般先于客户请求而启动,只要系统运行,该服务进程就一直存在,直到正常或强迫其终止。
1.6 面向连接的协议套接字的调用
使用面向连接的协议套接字调用流程如下图所示:
使用套接字接口通信的两个程序应当分别从系统分配到套接字,调用 Socket() 函数可以获得套接字。
从系统分配到的套接字,初始化时不与任何地址、端口相关联。套接字通过调用 bind() 函数绑定本地地址和端口。服务器端在等待连接之前必须调用 listen() 函数,然后调用 accept() 函数来等待连接;而客户端是通过 connect() 函数主动发起连接,当 accept() 函数完成时返回一个套接字,代表实际建立的连接。
然后是客户端与服务端之间的数据发送和接收过程,通过 send() 和 recv() 函数来完成,当使用完套接字后需要关闭套接字,从而释放系统已经分配的资源。
1.7面向无连接的协议套接字的调用
使用无连接的协议时,典型的套接字调用流程如下图所示:
面向无连接协议时,服务器一般是面向事务的。一个请求和一个应答就完成了客户端与服务端之间的交互。面向无连接协议套接字的调用使用的是数据 传输方式。
与面向连接的套接字类似,首先是通过 socket() 函数来分配套接字,然后通过 bind() 函数来绑定地址端口。在面向连接的套接字程序中,服务端需要监听和接受来自客户端的连接。而在面向无连接的套接字通信过程中,客户端直接通过调用 sendto() 函数向指定的地址和端口发送数据包,接收方通过 recvfrom() 函数来接收数据并获得原始数据包的地址和端口。
当使用完套接字后需要关闭,从而释放系统分配的资源。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!