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中zfill()方法的使用教程
May 20 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
Python 转义字符详细介绍
Mar 21 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
python 读取文件并替换字段的实例
Jul 12 Python
Python发送邮件功能示例【使用QQ邮箱】
Dec 04 Python
python如何读取bin文件并下发串口
Jul 05 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
wxPython之wx.DC绘制形状
Nov 19 Python
Python2与Python3的区别点整理
Dec 12 Python
Python实现进度条和时间预估的示例代码
Jun 02 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 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
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
Javascript 复制数组实现代码
2009/11/26 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
Python实现的概率分布运算操作示例
2017/08/14 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
python绘制热力图heatmap
2020/03/23 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
python中upper是做什么用的
2020/07/20 Python
详解Flask前后端分离项目案例
2020/07/24 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
女大学生毕业找工作的自我评价
2013/10/03 职场文书
代理协议书
2014/04/22 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
Vue图片裁剪组件实例代码
2021/07/02 Vue.js