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切换pip安装源的方法详解
Nov 18 Python
python使用SMTP发送qq或sina邮件
Oct 21 Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 Python
python 对多个csv文件分别进行处理的方法
Jan 07 Python
python爬虫 爬取超清壁纸代码实例
Aug 16 Python
python 利用opencv实现图像网络传输
Nov 12 Python
python实现视频压缩功能
Dec 18 Python
Jupyter Notebook 远程访问配置详解
Jan 11 Python
python sleep和wait对比总结
Feb 03 Python
Python基础之数据结构详解
Apr 28 Python
Python移位密码、仿射变换解密实例代码
Jun 27 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的中问验证码
2006/11/25 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
python实现图片识别汽车功能
2018/11/30 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
python实现简单坦克大战
2020/03/27 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
给男朋友的道歉信
2014/01/12 职场文书
电子邮箱格式怎么写
2014/01/12 职场文书
小学开学寄语
2014/01/19 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis