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 bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
python通过函数属性实现全局变量的方法
May 16 Python
Django中传递参数到URLconf的视图函数中的方法
Jul 18 Python
python实现简单遗传算法
Mar 19 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
pytorch进行上采样的种类实例
Feb 18 Python
python实现密码强度校验
Mar 18 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
简单了解如何封装自己的Python包
Jul 08 Python
基于tensorflow权重文件的解读
May 26 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
相对路径转化成绝对路径
2007/04/10 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
tensorflow识别自己手写数字
2018/03/14 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
linux面试题参考答案(10)
2016/10/26 面试题
售后前台接待岗位职责
2015/04/03 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
工作建议书范文
2019/07/08 职场文书