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-environ如何区分不同环境
Aug 26 Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
Oct 14 Python
Pytorch中膨胀卷积的用法详解
Jan 07 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
Python logging日志模块 配置文件方式
Jul 12 Python
Python中Selenium库使用教程详解
Jul 23 Python
Python高并发解决方案实现过程详解
Jul 31 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
使用Pytorch训练two-head网络的操作
May 28 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 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错误日志 display_errors与log_errors的区别
2012/10/09 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
js代码实现微博导航栏
2015/07/30 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
JS常用知识点整理
2017/01/21 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
详解AngularJS controller调用factory
2017/05/19 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
JS回调函数深入理解
2019/10/16 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
python opencv实现简易画图板
2020/08/27 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
优质的学校老师推荐信
2013/10/28 职场文书
会计专业自荐信
2013/12/02 职场文书
办公室文书岗位职责
2013/12/16 职场文书
开学季活动策划方案
2014/02/28 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
实习科室评语
2015/01/04 职场文书
李强感恩观后感
2015/06/17 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
Redis Lua脚本实现ip限流示例
2022/07/15 Redis