python网络编程:socketserver的基本使用方法实例分析


Posted in Python onApril 09, 2020

本文实例讲述了python网络编程:socketserver的基本使用方法。分享给大家供大家参考,具体如下:

本文内容:

  • socketserver的介绍
  • socketserver的使用
  • socketserver的异步服务端

首发时间:2018-03-21


也可以使用socketserver来创建socket


socketserver的介绍:

  • socketserver是标准库中的一个高级模块
  • socketserver可以简化创建客户端跟创建服务端的代码

socketserver的使用:

  • 首先导入模块:import socketserver
  • 初始化控制器类Handler【Handler是一个继承BaseRequestHandler的类Handler中的handle方法决定了每一个连接过来的操作】 【控制器类的类名可以是其他的,不一定是Handler,只要继承了BaseRequestHandler就行】
    • init():初始化控制设置,初始化连接套接字,地址,处理实例等信息
    • handle(): 定义了如何处理每一个连接。
    • setup(): 在handle()之前执行.一般用作设置默认之外的连接配置
    • finish():在handle()之后执行。
    • 变量:
      • self.request属性是套接字对象,所以使用self.request.xxxx调用套接字的函数
      • self.server包含调用处理程序的实例
      • self.client_address是客户端地址信息
  • 定义服务端类型【将Handler类和服务端的地址端口参数传入】:
    • TCPServer 支持ipv4的TCP协议的服务器。
      • server=socketserver.TCPServer((HOST,PORT),Handler)【Handler】
    • UDPServer 支持ipv4的UDP协议的服务器。
      • server=socketserver.UDPServer((HOST,PORT),Handler)
  • 运行服务端
    • 持续循环运行:serve_forever(),即使一个连接报错了,但不会导致程序停止,而是会持续运行,与其他客户端通信
      • server.serve_forever()
      • python网络编程:socketserver的基本使用方法实例分析
    • 停止server_forever:shutdown()
      • server.shutdown()

服务端:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
 def handle(self):
  try:
   while True:
    self.data=self.request.recv(1024)
    print("{} send:".format(self.client_address),self.data)
    if not self.data:
     print("connection lost")
     break
    self.request.sendall(self.data.upper())
  except Exception as e:
   print(self.client_address,"连接断开")
  finally:
   self.request.close()
 def setup(self):
  print("before handle,连接建立:",self.client_address)
 def finish(self):
  print("finish run after handle")

if __name__=="__main__":
 HOST,PORT = "localhost",9999
 server=socketserver.TCPServer((HOST,PORT),MyTCPHandler)

 server.serve_forever()

客户端:

import socket

client=socket.socket()

client.connect(('localhost',9999))
while True:
 cmd=input("(quit退出)>>").strip()
 if len(cmd)==0:
  continue
 if cmd=="quit":
  break
 client.send(cmd.encode())
 cmd_res=client.recv(1024)
 print(cmd_res.decode())

client.close()

socketserver的异步服务端:

多线程:ThreadingTCPServer

多进程:ForkingTCPServer(Unix)

多线程版:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
 def handle(self):
  try:
   while True:
    self.data=self.request.recv(1024)
    print("{} send:".format(self.client_address),self.data)
    if not self.data:
     print("connection lost")
     break
    self.request.sendall(self.data.upper())
  except Exception as e:
   print(self.client_address,"连接断开")
  finally:
   self.request.close()
 def setup(self):
  print("before handle,连接建立:",self.client_address)
 def finish(self):
  print("finish run after handle")


HOST,PORT = "localhost",9999

server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)#多线程版
server.serve_forever()

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
Python下载懒人图库JavaScript特效
May 28 Python
python实现识别相似图片小结
Feb 22 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
python+opencv轮廓检测代码解析
Jan 05 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
tensorflow安装成功import tensorflow 出现问题
Apr 16 Python
查看keras各种网络结构各层的名字方式
Jun 11 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 #Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 #Python
python实现处理mysql结果输出方式
Apr 09 #Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 #Python
python数据分析工具之 matplotlib详解
Apr 09 #Python
使用python检查yaml配置文件是否符合要求
Apr 09 #Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 #Python
You might like
php下载excel无法打开的解决方法
2013/12/24 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
关于jQuery中的end()使用方法
2011/07/10 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
JS如何生成动态列表
2020/09/22 Javascript
python三元运算符实现方法
2013/12/17 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
Python程序中设置HTTP代理
2016/11/06 Python
python中的字典操作及字典函数
2018/01/03 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
pygame实现五子棋游戏
2019/10/29 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
ORACLE第二个十问
2013/12/14 面试题
优秀食品类广告词
2014/03/19 职场文书
股东协议书范本
2014/04/14 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
应届生求职信范文
2014/05/26 职场文书
西安导游词
2015/02/12 职场文书
新娘婚礼致辞
2015/07/27 职场文书
电工实训心得体会
2016/01/14 职场文书