基于python socketserver框架全面解析

所属分类: 脚本专栏 / python 阅读数: 214
收藏 0 赞 0 分享

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()

客户端:

# 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, PORT), 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实现按学生年龄排序的实际问题详解

这篇文章主要给大家介绍了关于Python实现按学生年龄排序实际问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
收藏 0 赞 0 分享

Python开发的HTTP库requests详解

Requests是用Python语言编写,基于urllib,采用Apache2 Licensed开源协议的HTTP库。它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。Requests的哲学是以PEP 20 的习语为中心开发的,所以它比urllib更加P
收藏 0 赞 0 分享

Python网络爬虫与信息提取(实例讲解)

下面小编就为大家带来一篇Python网络爬虫与信息提取(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

在python3环境下的Django中使用MySQL数据库的实例

下面小编就为大家带来一篇在python3环境下的Django中使用MySQL数据库的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Python 3.x读写csv文件中数字的方法示例

在我们日常开发中经常需要对csv文件进行读写,下面这篇文章主要给大家介绍了关于Python 3.x读写csv文件中数字的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
收藏 0 赞 0 分享

Python实现解析Bit Torrent种子文件内容的方法

这篇文章主要介绍了Python实现解析Bit Torrent种子文件内容的方法,结合实例形式分析了Python针对Torrent文件的读取与解析相关操作技巧与注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Python实现文件内容批量追加的方法示例

这篇文章主要介绍了Python实现文件内容批量追加的方法,结合实例形式分析了Python文件的读写相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Python简单实现自动删除目录下空文件夹的方法

这篇文章主要介绍了Python简单实现自动删除目录下空文件夹的方法,涉及Python针对文件与目录的读取、判断、删除等相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

简单学习Python多进程Multiprocessing

这篇文章主要和大家一起简单的学习Python多进程Multiprocessing ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Python导入模块时遇到的错误分析

这篇文章主要给大家详细解释了在Python处理导入模块的时候出现错误以及具体的情况分析,非常的详尽,有需要的小伙伴可以参考下
收藏 0 赞 0 分享
查看更多