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使用Socket(Https)Post登录百度的实现代码
May 18 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
python实现海螺图片的方法示例
May 12 Python
用Python实现BP神经网络(附代码)
Jul 10 Python
对python中assert、isinstance的用法详解
Nov 27 Python
基于Django signals 信号作用及用法详解
Mar 28 Python
Python requests模块安装及使用教程图解
Jun 30 Python
python import 上级目录的导入
Nov 03 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
python实现简单区块链结构
Apr 25 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
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
ext for eclipse插件安装方法
2008/04/27 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
jquery设置按钮停顿3秒不可用
2014/03/07 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
js实现密码强度检验
2017/01/15 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
python opencv之SURF算法示例
2018/02/24 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
python中的for循环
2018/09/28 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
Python 发送邮件方法总结
2020/08/10 Python
Python requests上传文件实现步骤
2020/09/15 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
应用数学自荐书范文
2013/11/24 职场文书
办公室助理岗位职责
2013/12/25 职场文书
如何写好升职自荐信
2014/01/06 职场文书
鲁迅故里导游词
2015/02/05 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
战友聚会致辞
2015/07/28 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis
python中if和elif的区别介绍
2021/11/07 Python
MySQL查询日期时间
2022/05/15 MySQL