您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

基于python socketserver框架全面解析

5b51 2022/1/14 8:16:26 python 字数 7022 阅读 324 来源 www.jb51.cc/python

socketserver框架是一个基本的socket服务器端框架,使用了threading来处理多个客户端的连接,使用seletor模块来处理高并发访问,是值得一看的python标准库的源码之一

概述

socketserver框架是一个基本的socket服务器端框架,使用了threading来处理多个客户端的连接,使用seletor模块来处理高并发访问,是值得一看的python 标准库的源码之一

对于select网络框架的理解可以看 << 基于python select.select模块通信的实例讲解 >>。socketserver框架采用了selector框架来供你选择相适应的网络通信框架,比如select,poll,epoll等。有了这些网络框架我们就能处理高并发的网络访问了.

先看看示例代码吧:

# coding: utf-8
import socketserver


class MyTCPHandler(socketserver.BaseRequestHandler):
 """
 The request handler class for our server.
 It is instantiated once per connection to the server,and must
 override the handle() method to implement communication to the
 client.
 """

 def handle(self):
  # self.request is the TCP socket connected to the client
  self.data = self.request.recv(1024).strip()
  print("{} wrote:".format(self.client_address[0]))
  print(self.data)
  # just send back the same data,but upper-cased
  self.request.sendall(self.data.upper())


if __name__ == "__main__":
 HOST,PORT = "localhost",9999

 # Create the server,binding to localhost on port 9999
 # 如果子类没有某个方法或是属性,就回去父类调用
 with socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler) as server:
  # Activate the server; this will keep running until you
  # interrupt the program with Ctrl-C
  server.serve_forever()

客户端:@H_403_16@

# coding: utf-8
import socket


sk = socket.socket()
sk.connect(("127.0.0.1",9999)) # 主动初始化与服务器端的连接
while True:
 send_data = input("输入发送内容:")
 sk.sendall(bytes(send_data,encoding="utf8"))
 if send_data == "byebye":
  break
 accept_data = str(sk.recv(1024),encoding="utf8")
 print("".join(("接收内容:",accept_data)))
sk.close()

我们创建一个继承自BaseRequestHandler类的TCP请求处理类,说白了这个类就是我们自己封装的基于socket的recv()函数与send()函数的类,而所谓的TCP请求处理类其实就是对socket服务器端的bind,listen,accept等处理的封装类,而且这个封装的并不是简单的socket,而是基于select或是epoll等网络框架的类,我们调用这个类就能轻易地处理高并发的网络访问. 其实认真阅读源码,你会发现整体的程序设计是基于事件驱动的,事件驱动机制的三个要素: 消息(事件)队列,消息(事件)触发,事件循环。只不过socketserver框架的事件驱动机制就做到了socket的accept()方法那,接下来的消息接受(recv)与发送(send)就没有在做封装成相应的事件来进行处理了。

在这里一个要注意的地方,我使用了ThreadingTCPServer()类响应多个客户端的连接,但是当我阅读这个类的源码的时候,表示很疑惑啊!

class ThreadingTCPServer(ThreadingMixIn,TCPServer): pass

这让我很疑惑啊,再看看调用

with socketserver.ThreadingTCPServer((HOST,MyTCPHandler) as server:
  # Activate the server; this will keep running until you
  # interrupt the program with Ctrl-C
  server.serve_forever()

这更疑惑,ThreadingTCPServer哪来的构造函数,后来研究了一下,原来当子类的某个函数或是属性发生调用时,如果不是重载了父类方法或是属性,而且子类中没有这个方法或是属性,就会去调用父类相对应的方法或是属性,于是上面的就是调用了TCPServer的初始化函数__init__以及serve_forever(),随后调用的是子类的Request_handler函数

程序结果:

以上这篇基于python socketserver框架全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。

总结

以上是编程之家为你收集整理的基于python socketserver框架全面解析全部内容,希望文章能够帮你解决基于python socketserver框架全面解析所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶