当前位置: 首页 > article >正文

37. socketserver模块

一、socketserver模块

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

描述
BaseServer包含核心服务器功能和 min-in 类的钩子;
仅用于推导,这样不会创建这个类的实例;
可以用 TCPServer 或 UDPServer 创建类的实例
TCPServer/UDPServer基础的网络同步 TCP/UDP 服务器
UnixStreamServer/UnixDatagramServer基于文件的基础同步 TCP/UDP 服务器
ForkingMixIn/ThreadingMixIn核心派出或线程功能;
只用作 mix-in 类与一个服务器类配合实现一些异步性;
不能直接实例化这个类
ForkingTCPServer/ForkingUDPServerForkingMixIn 和 TCPServer/UDPServer 的组合
ThreadingTCPServer/ThreadingUDPServerThreadingMixIn 和 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()                                          # 关闭客户端套接字

http://www.kler.cn/a/456783.html

相关文章:

  • 算法-判断快乐数
  • android app构建时排除指定类
  • 代码随想录day29 | leetcode 134.加油站 135.分发糖果 860.柠檬水找零 406.根据身高重建队列
  • 风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注
  • NXP i.MX8系列平台开发讲解 - 5.4 调试篇 - 掌握perf 工具调试(一)
  • vue 嵌套el-dialo,当内层的弹窗弹出时,整个页面被遮罩
  • 两种不同的LuaBehaviour生命周期绑定
  • 【Linux学习五】时间日期指令与查找指令
  • Slater 条件与 KKT 条件
  • 字符串存储、分割相关总结(strncpy 函数和strtok() 函数相关)
  • 钉钉h5微应用鉴权配置客户端 API 鉴权步骤
  • 智能网关在电力物联网中的应用
  • 洛谷P5266 【深基17.例6】学籍管理(c嘎嘎)
  • 每天五分钟机器学习:凸函数
  • 清空DNS 缓存
  • 5.银河麒麟V10(ARM) 离线安装redis
  • 网易企业邮箱登陆:保障数据安全
  • Linux Shell : Process Substitution
  • 【每日学点鸿蒙知识】userAgent识别问题、StatusBar颜色、taskpool中操作同一个对象、scroll组件
  • Hive练习题11-15
  • 【数据库初阶】Linux中库的基础操作
  • Spark SQL DML语句
  • 数据结构与算法Python版 图
  • 【论文阅读】Reducing Activation Recomputation in Large Transformer Models
  • 渗透测试中常见的端口
  • springboot508基于Springboot宠物商城网站系统(论文+源码)_kaic