• 14 Python使用网络


    概述

            在上一节,我们介绍了如何在Python中使用Json,包括:Json序列化、Json反序列化、读Json文件、写Json文件、将类对象转换为Json、将Json转换为类对象等内容。在这一节,我们将介绍如何在Python中使用网络。Python网络编程覆盖的范围非常广,包括:套接字编程、socketserver、HTTP和Web开发、异步编程和asyncio等。在本专栏中,我们将只介绍比较基础的套接字编程和socketserver。

    套接字编程

            套接字是用于在计算机之间进行通信的基本接口。Python的socket库提供了一个用于创建和管理套接字的接口,你可以使用这个库来创建客户端和服务器应用程序。socket库提供了许多用于网络编程的函数,以下是一些常用的函数列表。

    函数

    含义

    socket()

    创建一个新的套接字对象。

    bind()

    将套接字绑定到指定的地址(IP地址和端口号)。

    listen()

    开始在套接字上监听传入的TCP连接。

    accept()

    接受来自客户端的TCP连接,并返回客户端套接字和地址。

    connect()

    连接到指定的TCP服务器和端口。

    send()

    发送TCP数据到连接的服务器。

    recv()

    从连接的服务器接收TCP数据。

    sendall()

    发送所有TCP数据到连接的服务器。

    recvfrom()

    从连接的服务器接收UDP数据,并返回数据和发送者的地址。

    sendto()

    向连接的服务器发送UDP数据,并指定数据和接收者的地址。

    getsockname()

    返回套接字自身的地址,返回值通常是元组(ip, port)。

    getpeername()

    返回连接的对端地址,返回值通常是元组(ip, port)。

    setsockopt()

    设置套接字的选项。

    getsockopt()

    获取套接字的选项。

    close()

    关闭套接字连接。

    select()

    监视多个套接字,等待它们变得可读或可写。

    setblocking(flag)

    如果flag为 False,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。

            接下来,我们介绍几个比较重要的套接字函数。

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

    1. import socket
    2. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            在上面的示例代码中,我们创建了一个TCP套接字。AF_INET参数指定了该套接字使用IPv4协议,SOCK_STREAM参数指定了该套接字使用TCP协议。

            2、连接服务器:使用connect()函数连接到服务器。

    1. import socket
    2. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    3. server_address = ('localhost', 8000)
    4. sock.connect(server_address)

            在上面的示例代码中,我们创建了一个套接字,并将其连接到本地主机8000端口上的服务器。

            3、发送和接收数据:使用send()函数发送数据,使用recv()函数接收数据。

    1. import socket
    2. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    3. server_address = ('localhost', 8000)
    4. sock.connect(server_address)
    5. message = b'Hello, CSDN'
    6. sock.send(message)
    7. data = sock.recv(1024)
    8. print('Received', repr(data))
    9. sock.close()

            在上面的示例代码中,我们创建了一个套接字,并将其连接到本地主机8000端口上的服务器。然后,我们发送了一个消息,并等待接收响应。最后,我们关闭了套接字。

            下面我们给出一个简单的服务端程序和客户端程序。服务端程序的示例代码如下:

    1. # Server.py
    2. import socket
    3. # 创建socket对象
    4. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    5. # 绑定IP地址和端口号
    6. server_socket.bind(('localhost', 8000))
    7. # 开始监听连接
    8. server_socket.listen()
    9. print('Waiting connect...')
    10. # 接受客户端连接
    11. client_socket, client_address = server_socket.accept()
    12. print('Client connect success:', client_address)
    13. # 接收客户端发送的数据
    14. data = client_socket.recv(1024)
    15. print('Recv data:', data.decode())
    16. # 向客户端发送数据
    17. client_socket.send('Hello client'.encode())
    18. # 关闭连接
    19. client_socket.close()
    20. server_socket.close()

            客户端程序的示例代码如下:

    1. # Client.py
    2. import socket
    3. # 创建socket对象
    4. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    5. # 连接服务器
    6. client_socket.connect(('localhost', 8000))
    7. # 向服务器发送数据
    8. client_socket.send('Hello server'.encode())
    9. # 接收服务器发送的数据
    10. data = client_socket.recv(1024)
    11. print('Recv data:', data.decode())
    12. # 关闭连接
    13. client_socket.close()

    socketserver

            socketserver模块是一个用于构建基于套接字的网络服务器的模块。这个模块提供了一些类,比如:SocketServer、TCPServer、UDPServer等,用于处理底层的socket通信,并且还提供了处理器类,用于处理每个客户端的请求。

            下面我们给出一个基于socketserver的服务端程序,其示例代码如下:

    1. # Server2.py
    2. import socketserver
    3. class MyTCPHandler(socketserver.BaseRequestHandler):
    4. def handle(self):
    5. self.data = self.request.recv(1024).decode()
    6. print(f'Recv data from {self.client_address[0]}: {self.data}')
    7. self.request.sendall(b"Hello client")
    8. socketserver.TCPServer.allow_reuse_address = True
    9. server = socketserver.TCPServer(('localhost', 8000), MyTCPHandler)
    10. server.serve_forever()

            在上面的示例代码中,我们创建了一个自定义的TCP处理器类MyTCPHandler,该类继承自socketserver.BaseRequestHandler。这个处理器类有一个handle()函数,当有新的客户端连接时,这个函数便会被调用。我们在这个函数中接收客户端发送的数据,并发送一条回应。然后,我们创建了一个TCP服务器对象,指定了要连接的服务器地址和端口,以及我们自定义的处理器类。最后,调用server的serve_forever方法,开始监听客户端的连接。

  • 相关阅读:
    《可信计算技术最佳实践白皮书》发布,龙蜥助力可信计算技术应用推广(可下载)
    拆串后再列间分组计平均
    MySQL递归查询所有子集
    Transformer和ELMo模型、word2vec、独热编码(one-hot编码)之间的关系
    「Python」身份运算符 —— is 与 is not
    Mybatis入门,day2,动态SQL
    DPU加速AI应用“遍地开花”,中科驭数亮相2023全球AI芯片峰会
    WebRTC 如何指定 H265解码器
    三层交换机与防火墙对接上网如何配置
    一个重量级HTTP api的304优化分析与突发失效问题解决
  • 原文地址:https://blog.csdn.net/hope_wisdom/article/details/132795990