首页 > 其他分享 >SocketServer模块

SocketServer模块

时间:2022-11-14 13:55:17浏览次数:62  
标签:SocketServer socketserver self request server 模块 class 客户端

1.1 SocketServer四种基本流及 异步处理理论部分

  1、SocketServer作用

      1. socket无法支持多并发,SocketServer 可以实现多并发

      2. SocketServer使编写一个Socket服务器通信变得更加简单

      3. SocketServer其实就是对socket的再封装

  2、SocketServer提供了4个基本的服务类

      1. TCPServer针对TCP套接字流
      2. UDPServer针对UDP数据报套接字
      3. UnixStreamServer和UnixDatagramServer针对UNIX域套接字,不常用(Unix本机间通信)
      4. 它们的继承关系如下:

img

 3、异步处理

      1. 上面四个服务类都是同步处理请求的,一个请求没处理完不能处理下一个请求

      2. 要想支持异步模型,可以利用多继承让server类继承ForkingMixIn 或 ThreadingMixIn mix-in classes。

      3. ForkingMixIn利用多进程(分叉)实现异步。

      4. ThreadingMixIn利用多线程实现异步。

  4.、请求处理类

      1. 要实现一项服务,还必须派生一个handler class请求处理类,并重写父类的handle()方法

      2. handle方法就是用来专门是处理请求的,该模块是通过服务类和请求处理类组合来处理请求的。

      3. SocketServer模块提供的请求处理类有BaseRequestHandler,以及它的派生类StreamRequestHandler和DatagramRequestHandler

      4. 从名字看出可以一个处理流式套接字,一个处理数据报套接字。

  5、实现异步,支持多连接

      1. 前面介绍服务类时提到过,四个基本的服务类默认是同步模型的。

      2. 要想支持异步可以利用多继承从ForkingMixIn 或ThreadingMixInmix-in classes和一个基本的服务类继承来定义一个支持异步的服务类

      3. 比如:class Server(ThreadingMixIn, TCPServer): pass

      4. ForkingMixIn 要考虑进程间的通信。ThreadingMixIn要考虑线程访问同一变量时的同步和互斥

1.2 创建socketserver实现: 多客户端并发

  1、创建一个socketserver 至少分以下几步

      1. 创建一个request handler class(请求处理类),继承自BaseRequestHandler class并重写它的handle()方法,该方法将处理客户端的请求。

      2. 实例化一个server class对象,并将服务的地址和之前创建的request handler class传递给它。

       server class****对象有这些:TCPServer;UDPServer;UnixStreamServer;UnixDatagramServer

      3. 调用server class对象的handle_request() 或 serve_forever()方法来开始处理请求

      4. handle_request和server_forever区别是server_forever只是反复handle_request而已

建议版本server

import socketserver
class MyTcpServer(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            self.request.recv(1024)
            self.request.send('I am server'.encode('utf-8'))
server = socketserver.ThreadingTCPServer(('127.0.0.1',8888),MyTcpServer)
server.serve_forever()

socketserver实现多客户端并发:server端

import socketserver
#每个客户端过来都会实例化一个MyTCPHandler实例,并调用handle方法来处理与客户端的通信
class MyTCPHandler(socketserver.BaseRequestHandler):
#1 第一步:创建一个request handler class(请求处理类),继承自BaseRequestHandler class
    def handle(self):    #2 第二步:并重写它的handle()方法,该方法将处理客户端的请求
        while True:
            try:
                self.data = self.request.recv(1024).strip()   #conn.recv(1024) = self.request.recv()
                print("{} wrote:".format(self.client_address[0]))
                print(self.data)
                self.request.send(self.data.upper())      #conn.send()=self.request.sendall()
            except ConnectionResetError as e:
                print("error",e)
                break
if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) #socketserver.TCPServer(单)
    server.serve_forever()  #4 第四步:调用server class对象的serve_forever()方法来开始处理请求
#3 第三步:实例化一个server class对象,并将服务的地址和之前创建的request handler class传递给它
#注: 实例化一个server class对象工作原理
#a. (HOST, PORT):将监听地址当做一个参数传递给socketserver.TCPServer()
#b. 每连接一个客户端就用MyTCPHandler实例化一个对象,将实例对象传送给socketserver.TCPServer
#c. 然后服务器端使用MyTCPHandler类中的handle方法与客户端通信

socketserver实现多个客户端并发:client端

import socket
client = socket.socket()                      #声明socket类型,同时生成socket连接对象
client.connect(('localhost',9999))            #指定要连接的服务器地址和端口号
while True:
    msg = input(">>:").strip()               #输入要发送给服务器的消息
    if len(msg) == 0:continue                #如果客户端输入空格,让客户端继续输入
    client.send(msg.encode("utf-8"))         #将输入的消息发送到服务器端
    data = client.recv(1024)                 #接收服务器端发送过来的数据,每次1024字节
    print('client_recv:',data)               #将从服务器端接收的数据在客户端打印出来
client.close()

标签:SocketServer,socketserver,self,request,server,模块,class,客户端
From: https://www.cnblogs.com/chunyouqudongwuyuan/p/16888814.html

相关文章

  • webpack模块化的原理
    commonjs在webpack中既可以书写commonjs模块也可以书写es模块,而且不用考虑浏览器的兼容性问题,我们来分析一下原理。首先搞清楚commonjs模块化的处理方式,简单配置一下webp......
  • 转速测量脉冲信号采集 Modbus模块 编码器脉冲计数器pnp/npn转485
    特点:●编码器解码转换成标准ModbusRTU协议●可用作编码器计数器或者转速测量●支持编码器计数,可识别正反转●也可以设置作为2路独立DI高速计数器●计数值支持断电自动......
  • E710芯片系列四口模块
    简介E710四口模块是一款高性能的嵌入式UHF超高频电子标签读写模块,完全自主知识产权设计,结合专有的高效碰撞处理算法,在保持高识读率的同时,实现对电子标签的快速读写处理,可广......
  • 【林加一】元数据挖掘模块的设计
    在喜马拉雅上班时,觉得元数据+xql+panda非常好用,非常适配南林金智这帮起名只起拼音缩写的人的起名习惯,遂将其设计理念抄过来。 总体上来说,本项目的元数据模块提供元数据......
  • #yyds干货盘点#vue使用事件总线进行模块之间的通信
        vue组件非常常见的有父子组件通信,兄弟组件通信。而父子组件通信就很简单,父组件会通过props传数据给子组件,当子组件有事情要告诉父组件时会通过$emit事件告诉......
  • pyhon常用的模块
    OS模块   SYS模块   time模块  datetime模块 ......
  • 【Python零基础入门篇 · 41】:内置模块的使用二:pyinstaller模块(打包py文件以及更换图
    pyinstaller模块pyinstaller是第三方模块,需要在Terminal输入命令安装:pipinstallpyinstaller步骤演示在Day18.py文件下写入代码在cmd或Terminal找到文件进行打包。......
  • 【ES6】模块化
    模块化1、模块化模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来。2、ES6模块化语法模块功能主要由两个命令构成:export和importexport命令用于......
  • RUST包管理 模块系统讲解
    RUST包管理模块系统0一些基本概念package:包,cargonew生成的整个项目应该可以叫做包(我个人理解是这样的,至少package是最顶层的)一个package包含零个或一个库crate(lib......
  • 模块独立
    模块独立​ 模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。衡量模块独立程度的标准有两个:耦合性和内聚性。耦合耦合是模块之间的......