37. socketserver模块

一、socketserver模块

  SocketServer 是标准库中的一个高级模块,它的目标是简化很多样板代码,它们是创建网络客户端和服务器所必须的代码。这个模块中有为你创建的各种各样的类。

描述
BaseServer 包含核心服务器功能和 min-in 类的钩子;
仅用于推导,这样不会创建这个类的实例;
可以用 TCPServer 或 UDPServer 创建类的实例
TCPServer/UDPServer 基础的网络同步 TCP/UDP 服务器
UnixStreamServer/UnixDatagramServer 基于文件的基础同步 TCP/UDP 服务器
ForkingMixIn/ThreadingMixIn 核心派出或线程功能;
只用作 mix-in 类与一个服务器类配合实现一些异步性;
不能直接实例化这个类
ForkingTCPServer/ForkingUDPServer ForkingMixIn 和 TCPServer/UDPServer 的组合
ThreadingTCPServer/ThreadingUDPServer ThreadingMixIn 和 TCPServer/UDPServer 的组合
BaseRequestHander 包含服务请求的核心功能;
仅仅用于推导,这样无法创建这个类的实例;
可以使用 StreamRequestHandler 或 DatagramRequestHandler 创建类的实例
StreamRequestHander/DatagramRequestHandler 实现 TCP/UDP 服务器的服务处理器

二、基于TCP协议通信

2.1、创建socketserver的TCP服务器

from socketserver import ThreadingTCPServer,StreamRequestHandler
from time import ctime

HOST = "127.0.0.1"
PORT = 8085
ADDRESS = (HOST, PORT)


class MyRequestHandler(StreamRequestHandler):
    def handle(self):
        # 如果是tcp协议,self.request --> connection
        print("...connected from: ",self.client_address)

        while True:  # 通信循环
            try:
                data = self.request.recv(1024)                              # 服务端接收消息,单次最大接收为1024个字节
                # 在Linux系统中,一旦data收到空,意味着是一种异常的行为:客户端非法断开连接
                if not data:                                                # 适用于Linux系统
                    break
                print("收到客户端%s数据:%s" % (self.client_address,data.decode("utf-8")))
                self.request.send(f"[{ctime()}] {data}".encode("utf-8"))    # 服务端发送消息
            except ConnectionResetError:                                    # 适用于Windows系统
                break

        self.request.close()


tcp_server = ThreadingTCPServer(ADDRESS,MyRequestHandler)
print("waiting for connection...")
tcp_server.serve_forever()

  我们得到请求处理程序,作为 socketserver 中 StreamRequestHandler 的一个子类,并重写了它的 handler() 方法,该方法在基类 Request 中默认情况下没有任何行为。当接收一个来自客户端的消息时,它就会调用 handler() 方法。

2.2、创建socketserver的TCP客户端

from socket import socket
from socket import AF_INET, SOCK_STREAM

HOST = "127.0.0.1"
PORT = 8085
ADDRESS = (HOST,PORT)

tcp_client = socket(AF_INET, SOCK_STREAM)                   # 创建客户端套接字
tcp_client.connect(ADDRESS)                                 # 尝试连接服务器

while True:                                                 # 通信循环
    data = input(">>>: ").strip()
    if not data:                                            # 按空格、回车等键结束连接
        break
    tcp_client.send(data.encode("utf-8"))                   # 客户端发送数据

    data = tcp_client.recv(1024)                            # 客户端接收数据,单次最大接收为1024个字节
    if not data:
        break
    print("收到服务端返回的数据:%s" % data.decode("utf-8"))

tcp_client.close()                                          # 关闭客户端套接字

三、基于UDP协议通信

3.1、创建socketserver的UDP服务器

from socketserver import ThreadingUDPServer,BaseRequestHandler
from time import ctime

HOST = "127.0.0.1"
PORT = 8086
ADDRESS = (HOST, PORT)


class MyRequestHandler(BaseRequestHandler):
    def handle(self):
        data = self.request[0]
        server = self.request[1]

        print("收到客户端%s数据:%s" % (self.client_address, data))
        server.sendto(f"[{ctime()}] {data}".encode("utf-8"), self.client_address)  # 服务端发送消息


udp_server = ThreadingUDPServer(ADDRESS,MyRequestHandler)
print("waiting for connection...")
udp_server.serve_forever()

3.2、创建socketserver的UDP客户端

from socket import socket
from socket import AF_INET, SOCK_DGRAM

HOST = "127.0.0.1"
PORT = 8086
ADDRESS = (HOST, PORT)

udp_client = socket(AF_INET,SOCK_DGRAM)                     # 创建服务器套接字

while True:                                                 # 通信循环
    data = input(">>>: ").strip()
    udp_client.sendto(data.encode("utf-8"),ADDRESS)         # 客户端发送数据

    data,server_addr = udp_client.recvfrom(1024)            # 客户端接收数据,单次最大接收为1024个字节
    print("收到服务端返回的数据:%s" % data.decode("utf-8"))

udp_client.close()                                          # 关闭客户端套接字
posted @   星光映梦  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示