基于Python的套接字编程

2023-03-23 02:39康梅娟郭状先
科技资讯 2023年3期
关键词:发送数据传输层客户机

康梅娟 郭状先

(临沂大学 山东临沂 276000)

Socket 也叫作套接字,用来实现网络通信[1]。它是网络通信中应用层和传输层之间的一个抽象层[2]。使用套接字,可以将网络中通信的主机之间复杂的通信过程简单化,套接字可以为应用层提供一些接口,应用层使用套接字提供的接口可以实现网络中的主机之间的通信。套接字包括 IP 地址和端口号两个部分。通过网络通信的每对进程需要使用一对套接字。不同的进程之间的通信所使用的套接字是不一样的,套接字可以用来区分不同的进程之间的数据传输。套接字主要有目标IP、传输层使用的传输协议、传输层使用的端口号这3 个重要参数。Socket 是面向客户/服务器模型而设计的[3]。通信的一方扮演客户机的角色,另一方扮演服务器的角色。服务器在运行中一直监听套接字指定的传输层端口,并等待着客户机的连接请求。当服务器端收到客户机发来的连接请求以后,服务器会接受客户机的连接请求,双方建立连接后,就可进行数据的传递。Socket 处于网络协议的传输层[4]。

套接字可以分为流式套接字、原始套接字和数据报套接字这3种不同的类型。(1)流式套接字使用传输层的TCP协议,它能够实现面向连接的、可靠的数据传输。(2)原始套接字主要用于一些协议的开发,可以进行比较底层的操作。(3)数据报套接字使用传输层的UDP 协议进行数据的传输,它实现的传输服务是无连接的、不可靠的。

该文主要介绍了网络中的主机使用TCP套接字和UDP 套接字进行通信的流程,以及在Python 中是如何实现TCP套接字和UDP套接字编程的。

1 Python中的套接字

在Python 中有许多网络编程框架,有原生的Socket调用如Select、Epoll,有标准库如TCPServer、UDPServer、HTTPServer[5]。每种编程语言都拥有各自的特征和优势,只有在合适的语言环境中,才能尽量发挥其功能和优势[6]。Python作为一种网络编程语言,它有很多库实现了常见的网络协议,它可以让程序员专注于程序的逻辑,而不需要关心底层的通信,可以使用Python 的socket 模块来引用套接字。要使用Python 实现套接字编程,需要导入socket 模块或框架。该模块由创建套接字并帮助它们彼此关联所需的内置方法组成。一些重要的方法具体如下。

socket.socket():用于创建套接字,服务器和客户端都需要创建套接字。

socket.accept():被动接受TCP 客户的连接,阻塞式等待连接的到来。

socket.bind():用于将套接字绑定到指定为参数的地址。

socket.close():关闭套接字。

socket.connect():用于连接到指定为参数的远程地址,主动初始化TCP 服务器连接。

socket.listen():使服务器能够接受连接,开始TCP监听。

socket.recv():接收TCP 数据。

socket.send():发送TCP 消息。

socket.sendall():发送完整的TCP数据。

sendto():发送UDP套接字的数据。

Recvfrom():接收UDP套接字的数据。

2 TCP套接字编程

2.1 建立基于TCP的服务器端连接

建立基于TCP 传输协议的服务器端连接的流程如下。

(1)调用socket方法创建套接字对象。

socket=socket.socket(netadd_type,socket_type)

socket 方法有两个参数。netadd_type 表示IP 地址的类型,如果使用的是ipv4 地址,则需将其值设置为AF_INET。socket_type 表示要创建的套接字的类型,在此需要创建的套接字是流式套接字,需将其值设置为SOCK_STREAM,表示在传输层使用的TCP协议。

(2)使用bind 方法将已创建的套接字绑定到指定的地址和端口上。

socket.bind(site)

bind 方法有一个参数site,该参数是一个二元元组(socket_host,socket_port),socket_host 用来指定IP地址或主机名,127.0.0.1 是标准的IPv4 回环地址,socket_port表示套接字中的端口号。

(3)使用listen 方法在已创建的socket 句柄上建立监听。

socket.listen(linknum)

listen 方法有一个参数linknum,该参数用来指定服务器允许的最多连接数。

(4)使用accept方法被动接受客户机的连接请求。

client_socket,client_address=socket.accept()

accept 方法用来接受一个来自客户机的连接请求,并返回一个新的套接字。服务器与此次接受的客户机之间的通信是通过在这个返回的新的套接字上收发数据来完成的。accept 方法被调用后会返回一个二元元组,client_socket 表示返回的新的套接字对象,client_address 表示发出连接请求的客户机的IP地址。

(5)通信双方进入数据传递阶段。

服务器可以使用send 或者sendall 方法向客户机发送数据,服务器要想接收客户机发来的数据可以使用recv方法。

(6)双方通信结束以后,服务器使用close()关闭已连接的套接字。

2.2 创建基于TCP的客户端连接

创建基于TCP 传输协议的客户端连接的流程如下。

(1)使用socket 方法创建一个用来和服务器建立连接的套接字。

client_socket=socket.socket(netadd_type,socket_type)

(2)调用connect()和服务器建立连接。

(3)客户机使用send 或sendall 方法发送数据,使用recv方法接收数据。

(4)数据传输结束后,客户机需要调用close()来关闭已连接的套接字。

2.3 使用Python 编程实现服务器与客户机基于TCP协议的通信

编写一个基于TCP 协议的客户机与服务器程序,在Python的IDLE编译器中运行,实现服务器与客户机之间的相互通信,使发送程序和接收程序能够接收键盘输入并彼此之间相互发送数据。

服务器需要先创建TCP 套接字,绑定套接字到本地IP 与指定端口,接下来开始监听,用一个while 循环一直监听有没有消息连接,并接受客户端的连接请求,然后接收客户端传来的数据,并发送给对方数据,数据传输完毕后,关闭套接字。服务器端程序具体如下。

客户端先创建TCP 套接字,申请和服务器建立连接,当和服务器成功建立连接后,开始收发数据,通信结束后,关闭已连接的套接字。客户端程序如下所示。

首先执行服务器端编写的程序,接下来执行客户端编写的程序,然后让客户机给服务器发送数据,再让服务器给客户机发送数据,以此循环,当客户机想和服务器结束通信时,可以输入“q”或“Q”。经过测试,服务器端程序和客户端程序能够接收键盘输入并彼此之间相互发送数据,程序运行正常,得到了预期的效果。

3 UDP套接字编程

由于UDP 协议是无连接的,UDP 套接字编程与TCP 套接字编程的区别在服务器端表现为,不需要使用监听函数listen()对客户端的连接进行监听;在客户端的表现为客户端的socket不需要与服务器建立连接就能够进行数据的发送与接收,即不需要使用connect()函数。

3.1 建立基于UDP的服务器端连接

建立基于UDP 传输协议的服务器端连接的流程如下。

(1)使用socket()创建一个套接字对象。

socket=socket.socket(netadd_type,socket_type)

对于IPV4协议的UDP协议,netadd_type参数应取值为AF_INET;socket_type 参数应取值为SOCK_DGRAM,表示创建的套接字类型是数据报套接字,使用的数据传输协议是UDP协议。

(2)将socket绑定到指定地址上,具体内容如下。

socket.bind(address)

(3)服务器使用sendto()发送数据,使用recvfrom()接收数据。

(4)通信双方的数据传递完毕后,服务器使用close()关闭已连接的套接字。

3.2 创建基于UDP的客户端连接

创建基于UDP 传输协议的客户端连接的流程如下。

(1)客户端使用socket方法创建一个套接字对象,用来和服务器建立连接。

(2)客户端使用sendto方法向服务器发送数据,使用recvfrom方法接收服务器发来的数据。

(3)通信结束后,客户端调用close 方法关闭已建立连接的套接字。

3.3 使用Python 编程实现服务器与客户机基于UDP协议的通信

编写一个基于UDP协议的客户机与服务器程序,实现相互通信。

客户端先创建UDP套接字,绑定套接字到本机IP和指定端口,然后开始循环收发消息,数据传输完毕之后,关闭套接字。服务器端程序如下。

客户端先创建UDP 套接字,连接服务器端地址,连接后向服务器循环收发消息,等数据传输完毕后,关闭套接字。客户端程序如下。

首先运行服务器端程序,接下来运行客户端程序,然后双方进行通信,双方程序都能够接收键盘输入并彼此之间相互发送数据,程序运行正常,得到了预期的效果。

4 结语

该文介绍了套接字的概念和分类,并通过实例介绍了如何使用Python开发基于TCP协议和UDP协议的聊天程序以及使用Python进行TCP套接字编程和UDP套接字编程的步骤。

猜你喜欢
发送数据传输层客户机
基于Python语言的网络传输层UDP协议攻击性行为研究
ZnO电子传输层在有机无机杂化钙钛矿太阳能电池中的应用
一种车载自组织网络的媒体接入控制协议
基于马尔科夫链的LoRaWAN网络节点性能分析
带标记方式的CRDSA++协议性能分析*
物联网无线通信传输层动态通道保障机制
基于物联网GIS的消防智能巡检系统设计与实现
使用IPSec安全传输数据
瘦客户机:安全与便捷的选择
升腾瘦客户机借神码翱翔“云端”