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实现文本去重且不打乱原本顺序
Jan 26 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
在python中使用xlrd获取合并单元格的方法
Dec 26 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 Python
python的slice notation的特殊用法详解
Dec 27 Python
python批量处理txt文件的实例代码
Jan 13 Python
使用Python爬取弹出窗口信息的实例
Mar 14 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
Python实现LR1文法的完整实例代码
Oct 25 Python
python单例模式的应用场景实例讲解
Feb 24 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使用Redis存储session时的一个Warning定位
2017/07/05 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
JS的数组的扩展实例代码
2008/07/09 Javascript
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
js select常用操作控制代码
2010/03/16 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
vue如何判断dom的class
2018/04/26 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
python学习笔记:字典的使用示例详解
2014/06/13 Python
简单介绍Python中的len()函数的使用
2015/04/07 Python
python冒泡排序简单实现方法
2015/07/09 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
python pandas时序处理相关功能详解
2019/07/03 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
简历自荐信
2013/12/02 职场文书
老人节标语大全
2014/10/08 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS