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 相关文章推荐
python连接mysql调用存储过程示例
Mar 05 Python
Python编程语言的35个与众不同之处(语言特征和使用技巧)
Jul 07 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
详解python发送各类邮件的主要方法
Dec 22 Python
浅谈对yield的初步理解
May 29 Python
详解python字节码
Feb 07 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
Python引用计数操作示例
Aug 23 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
python requests模拟登陆github的实现方法
Dec 26 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 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
2020最新CPU的性能排名
2020/04/02 数码科技
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
javascript深入理解js闭包
2010/07/03 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
这段代码难道不该打印出56吗
2013/02/27 面试题
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
篝火晚会主持词
2014/03/25 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
2015年采购员工作总结
2015/04/27 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android