1.概述

1.网络编程概述

随着网络技术的不断发展,特别是 Internet 的迅速发展,业务系统在互联网上也逐步完善,传统的应用也在向分布式应用逐步转变。尤其是物联网、边缘计算等技术的发展,对传统 C/S 应用在网络编程方面要求越来越高。Delphi 在网络编程方面具有独特的优势,其可视化、丰富的封装组件大大简化了程序员的开发工作,使得网络编程非常直观、高效。

Delphi 在网络编程方面内容相当丰富,包括网络协议体系结构、TCP/IP协议、基于 Web 的应用结构等方面,并且可以结合多线程、动态链接库及高级组件技术等进行开发。

本章主要介绍套接字 (Socket) 编程、电子邮件客户端、Http 协议方面的编程知识。本节主要介绍套接字 (Socket) 基础。

1.1 TCP、UDP 和 IP

首先,我们来了解一下 OSI 7 层模型。如下图所示:

1.概述

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 就是一种无连接的协议,数据传输方法采用的是数据报。

这两种服务方式各有优缺点:

  • 面向连接的服务能够保证通信双方传输的数据的正确性,但需要进行额外的校验,同时,通信双方建立通信信道也需要一定的系统开销。
  • 无连接服务最大的优点就是速度快,因为它不用去验证数据的正确性和完整性。实际开发中,许多网络游戏使用的就是 UDP ,可以用数据报不停地给其他的联网游戏者发送信息,丢失一个不要紧,因为下一个马上就到。
  • 1.4 套接字类型

    TCP/IP 的 Socket 提供了三种类型的套接字:

  • 流式套接字(SOCK_STREAM)
  • 流式套接字提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限制;数据被看作字节流,无长度限制,可以双向传输。文件传送协议 FTP 使用的就是流式套接字。

  • 数据报套接字(SOCK_DGRAM)
  • 提供一个无连接服务,数据包以独立包形式被发送,不提供无错保证,数据可以丢失或重复,并且接收顺序混乱。也就是说,一个建立在数据报套接字上所接收的信息可能重复、或者和发出时的顺序不同。

  • 原始套接字
  • 原始套接字允许对较低层的协议,如 IP、ICMP 直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。目前,只有 WinSock 2 提供对它的支持。

    在实践项目开发中,在使用 Delphi 开发网络应用程序时,通常不直接使用 WinSock,包括对 Internet 组件面板上的 TClientSocket 和 TServerSocket 组件也不提倡使用。同时,随着我国国产化的不断推进,渐渐地我们需要在 Linux 内核操作系统下进行软件开发,在开发工具方面可能 Lazarus、CodeTyphon 会使用得更多一些,在网络编程方面,Indy 组件包可能是更好的选择。

    1.5 客户/服务器模式

    在 TCP/IP 网络应用程序中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server Modal),即客户向服务器发出服务请求,服务器收到请求后,提供相应的服务。客户/服务器模式在操作过程中采取的是主动请求方式。

    首先服务端要先启动,并根据请求提供服务。

    1. 打开一通信信道并通知主机在某一公认的端口上(如 FTP 为 21)接收客户端请求
    2. 等待客户请求到达该端口
    3. 接收到重复服务请求,处理该请求并发送应答信息;接收到并发服务请求,则激活一新进程来处理客户请求,新进程处理该客户请求,并不需要对其他请求作出应答。服务完成后终止该新进程与客户的通信链路。
    4. 返回到 2 ,等待另一个客户请求
    5. 关闭服务器

    客户端:

    1. 打开一通信信道,并连接到服务器所在主机的特定端口
    2. 向服务器发送服务请求报文,等待并接收应答
    3. 继续提出请求
    4. 请求结束后关闭并终止通信信道

    从上面的描述可知:

    1. 客户与服务器进程的作用是非对称的,因此编码不同。
    2. 服务进程一般先于客户请求而启动,只要系统运行,该服务进程就一直存在,直到正常或强迫其终止。

    1.6 面向连接的协议套接字的调用

    使用面向连接的协议套接字调用流程如下图所示:

    1.概述

    使用套接字接口通信的两个程序应当分别从系统分配到套接字,调用 Socket() 函数可以获得套接字。

    从系统分配到的套接字,初始化时不与任何地址、端口相关联。套接字通过调用 bind() 函数绑定本地地址和端口。服务器端在等待连接之前必须调用 listen() 函数,然后调用 accept() 函数来等待连接;而客户端是通过 connect() 函数主动发起连接,当 accept() 函数完成时返回一个套接字,代表实际建立的连接。

    然后是客户端与服务端之间的数据发送和接收过程,通过 send() 和 recv() 函数来完成,当使用完套接字后需要关闭套接字,从而释放系统已经分配的资源。

    1.7面向无连接的协议套接字的调用

    使用无连接的协议时,典型的套接字调用流程如下图所示:

    1.概述

    面向无连接协议时,服务器一般是面向事务的。一个请求和一个应答就完成了客户端与服务端之间的交互。面向无连接协议套接字的调用使用的是数据报传输方式。

    与面向连接的套接字类似,首先是通过 socket() 函数来分配套接字,然后通过 bind() 函数来绑定地址端口。在面向连接的套接字程序中,服务端需要监听和接受来自客户端的连接。而在面向无连接的套接字通信过程中,客户端直接通过调用 sendto() 函数向指定的地址和端口发送数据包,接收方通过 recvfrom() 函数来接收数据并获得原始数据包的地址和端口。

    当使用完套接字后需要关闭,从而释放系统分配的资源。

    来源:IT职业教育

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年5月17日
    下一篇 2022年5月17日

    相关推荐