socketserver:

socketserver可用于实现并发通信。

socketserver 模块简化了编写网络服务程序的任务;同时 SocketServer 模块也是 Python标准库中很多服务器框架的基础。
socketserver 模块可以简化网络服务器的编写。Python把网络服务抽象成两个主要的类,一个是 Server 类,用于处理连接相关的网络操作,另外一个则是 RequestHandler 类,用于处理数据相关的操作;并且提供了两个Mixin类,用于扩展 Server,实现多进程或多线程。

Server 类:
它包含了种五种server类,BaseServer(不直接对外服务)。TCPServer使用TCP协议,UDPServer使用UDP协议,还有两个不常使用的,
即UnixStreamServer和UnixDatagramServer,这两个类仅仅在unix环境下有用(AF_unix)。

RequestHandler类:
所有requestHandler都继承BaseRequestHandler基类。

注: 全双工管道通信:既可以 收,也可以 发

单工、半双工和全双工的区别: https://blog.csdn.net/starstar1992/article/details/53032409

socketserver 的使用方法:

  1. import socketserver
  2.  
  3. """
  4. socketserver: 基于多线程实现的并发通信
  5. sockerserver 使用方法(固定套路):
  6. 1. 定义功能类
  7. class MyServer(socketserver.BaseRequestHandler):
  8. def handler(self):
  9. pass
  10.  
  11. 2. server = socketserver.threadingTCPServer(("127.0.0.1",8800),MyServer)
  12.  
  13. 3. server.server_forerver()
  14. """
  15.  
  16. class MyServer(socketserver.BaseRequestHandler): # 必须要继承 socketserver.BaseRequestHandler 这个类
  17.  
  18. def handler(self): # 必须要有 handler() 这个方法
  19. """
  20. handler() 方法里面要放并发的业务逻辑
  21. 该方法下的 self.request 也是固定写法,是一个套接字对象,即相当于 以前 socket 时的 conn
  22. """
  23. # 写自己的业务逻辑
  24. pass
  25.  
  26. # 通过 socketserver 引一个要 并发的类
  27. server = socketserver.ThreadingTCPServer(("127.0.0.1",8800),MyServer) # 第一个参数:IP和端口,第二个参数:要实例化的 功能类;threadingTCPServer 这个类是通过 多线程 帮我们实现的并发;用的是 TCP 协议
  28. # server = socketserver.ForkingTCPServer(("127.0.0.1",8800),MyServer) # 多进程 TCP 通信
  29. server.server_forerver()

websocket:

  1. websocket 其实就是 web socket,它也是一种协议
  2.  
  3. http 的问题:
  4. 1. http 是一个协议
  5. - 数据格式
  6. - 一次请求和响应之后断开连接(无状态、短连接)
  7. 2. 服务端不可以向客户端主动推送消息(因为不知道客户端的IP端口)
  8. 3. 服务端只能做出响应
  9. 4. 为了伪造服务端向客户端主动推送消息的效果,我们使用:轮询和长轮询
  10.  
  11. websocket 是一种新的协议: 1. 连接时需要握手;2.发送数据进行加密;3.连接之后不断开; websocket 解决了 服务端能够真正向客户端推送消息;缺点:兼容性
  12. - 数据格式:
  13. - 连接请求: http协议
  14. - 收发请求: websocket协议
  15. - 不断开连接
  16.  
  17. 基于 flaskwebsocket示例:
  18. # 安装:
  19. pip install gevent-websocket
  20.  
  21. 支持 websocket 的框架:
      所有框架都支持,但是,
      flask gevent-websocket
      djangochannel
      tornado 框架自带 websocket
  22.  
  23. 应用场景:实时响应

基于 flask 和 websocket 实现一个在线投票功能:

app.py

  1. from flask import Flask,render_template,request
  2. import json
  3.  
  4. # 使用 websocket 时 需要导入下面的两个模块
  5. from geventwebsocket.handler import WebSocketHandler
  6. from gevent.pywsgi import WSGIServer
  7.  
  8. # 发送 websocket 请求得通过 js 来实现
  9.  
  10. app = Flask(__name__)
  11.  
  12. USERS = {
  13. '':{'name':'钢弹','count':0},
  14. '':{'name':'铁锤','count':0},
  15. '':{'name':'贝贝','count':100},
  16. }
  17.  
  18. # http://127.0.0.1:5000/index # 浏览器在渲染 index.html 时,在执行 var ws = new WebSocket('ws://192.168.13.253:5000/message') 这句js代码时,客户端就会和服务端建立一个 websocket 的连接
  19. @app.route('/index')
  20. def index():
  21. return render_template('index.html',users=USERS)
  22.  
  23. # http://127.0.0.1:5000/message
  24. WEBSOCKET_LIST = [] # 用于保存所有的 websocket 连接;可理解为所有的客户端
  25.  
  26. @app.route('/message')
  27. def message():
  28. ws = request.environ.get('wsgi.websocket') # 如果不是 websocket 协议的请求,request.environ.get('wsgi.websocket') 的值是 None;如果是 websocket 请求, ws 将是一个 websocket 对象
  29. if not ws:
  30. print('http')
  31. return '您使用的是Http协议'
  32. WEBSOCKET_LIST.append(ws) # 把当前的 ws 连接添加到 WEBSOCKET_LIST 中
  33. while True:
  34. cid = ws.receive() # 接收投票的 cid; ws.receive() :接收客户端发过来的 websocket协议的 数据
  35. if not cid: # 如果客户端关闭连接 ws.receive() 接收到的将会是 None
  36. WEBSOCKET_LIST.remove(ws)
  37. ws.close() # 后台的 ws 也关闭
  38. break
  39.  
  40. old = USERS[cid]['count']
  41. new = old + 1
  42. USERS[cid]['count'] = new
  43.  
  44. for client in WEBSOCKET_LIST:
  45. client.send(json.dumps({'cid':cid,'count':new})) # 给前端返回一个字典
  46.  
  47. # 服务端通过 websocket 协议就可以向客户端主动推送消息;这是由于 客户端与服务端的连接没有断开; 需要事先在客户端的浏览器上 new 一个 WebSocket 的对象 (WebSocket 支持H5等,但低版本的浏览器不支持)
  48.  
  49. if __name__ == '__main__':
  50. http_server = WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler) # 如果是 http 协议的请求,就交给 app 去处理;如果是 websocket 协议的请求,就交给 WebSocketHandler 去处理。 # app 的 werkzeug 只能处理 http 请求
  51. http_server.serve_forever()

index.html

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. </head>
  8. <body>
  9. <h1>丑男投票系统</h1>
  10. <ul>
  11. {% for k,v in users.items() %}
  12. <li onclick="vote({{k}})" id="id_{{k}}">{{v.name}}<span>{{v.count}}</span></li>
  13. {% endfor %}
  14. </ul>
  15.  
  16. <script src="{{ url_for('static',filename='jquery-3.3.1.min.js')}}"></script>
  17. <script>
  18. var ws = new WebSocket('ws://192.168.13.253:5000/message') // 实例化一个WebSocket 对象: 用于向 192.168.13.253:5000/message 这个url 发送 websocket 协议的请求;该连接不会断开
  19. // 前端通过 ws.send("你好") 来发送 websocket协议的数据
  20.  
  21. ws.onmessage = function (event) { // 服务端返回 ws 数据的时候, ws.onmessage() 自动触发
  22. /* 服务器端向客户端发送数据时,自动执行 */
  23. // {'cid':cid,'count':new}
  24. var response = JSON.parse(event.data); // event.data 就是 服务端返回回来的数据
  25. $('#id_'+response.cid).find('span').text(response.count);
  26.  
  27. };
  28.  
  29. function vote(cid) {
  30. ws.send(cid) // 发送 websocket 数据
  31. }
  32. </script>
  33. </body>
  34. </html>

socketserver模块使用 & websocket的更多相关文章

  1. socket 和 SocketServer 模块

    一 .Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket socket(TCP,IP)通常也称作"套接字",用于描述IP地址和端 ...

  2. SocketServer模块

    在利用select实现伪并发的socket博文中我们说了: 如果要实现一个server端可以和多个客户端进行通信可以使用 1.多线程 2.多进程 3.select I/O多路复用 在那篇博文中我们介绍 ...

  3. 浅析python中socketserver模块使用

    虽然说用python编写简单的网络程序狠方便,但是复杂一点的网络程序还是用现成的框架比较好,这样就可以专心事物逻辑,而不是套接字的各种细节.Socketserver模块简化了编写网络服务程序,同时so ...

  4. Python网络编程(2)-粘包现象及socketserver模块实现TCP并发

    1. 基于Tcp的远程调用命令实现 很多人应该都使用过Xshell工具,这是一个远程连接工具,通过上面的知识,就可以模拟出Xshell远程连接服务器并调用命令的功能. Tcp服务端代码如下: impo ...

  5. Python之socketserver模块和验证客户端链接的合法性

    验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_ke ...

  6. python 内置标准库socketserver模块的思考

    socketserver模块简化了编写网络服务器的任务, 在很大程度上封装了一些操作, 你可以看成是事件驱动型的设计, 这很不错.它定义了两个最基本的类--服务器类 BaseServer, 请求处理类 ...

  7. socketserver模块TCP和UDP协议形式

    # >>>>>>>>>>>>>>>>>>>>服务端socketserver模块通 ...

  8. Python网络编程(3)——SocketServer模块与简单并发服务器

    主要类型 该模块有四个比较主要的类,其中常用的是 TCPServer 和 UDPServer. 1. TCPServer 2. UDPServer 3. UnixStreamServer,类似于TCP ...

  9. python-基于UDP通信的套接字,socketserver模块的使用

    一.基于UDP协议通信的套接字 udp是没有链接的,所以先启动哪一端都不会报错 import socket server=socket.socket(socket.AF_INET,socket.SOC ...

随机推荐

  1. Application,Service,Activity 三者的Context的应用场景

    Application 的 context 不是万能的,所以也不能随便乱用,对于有些地方则必须使用 Activity 的 Context, 对于Application,Service,Activity ...

  2. List与类之间的运用,即与javabean的应用

    package com.wh.Object; public class Goods { private String name; private double price; private int n ...

  3. 持有对方的引用&&内部类

    现在来做个很简单的东西,就是做一个做加法的图形界面 然后现在先是一个不用持有对方引用的写法: import java.awt.*; import java.awt.event.*; public cl ...

  4. T4870 水灾(sliker.cpp/c/pas) 1000MS 64MB

    题目描述 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY所在的城市可以用一个N*M(N,M<=50)的地图表 ...

  5. Android IJKPlayer缓冲区设置以及播放一段时间出错解决方案

    IJKPlayer拖动播放进度会导致重新请求数据,未使用已经缓冲好的数据,所以应该尽量控制缓冲区大小,减少不必要的数据损失. mMediaPlayer.setOption(IjkMediaPlayer ...

  6. R in action读书笔记(6)-第七章:基本统计分析(中)

    7.2 频数表和列联表 > library(vcd) > head(Arthritis) ID Treatment Sex Age Improved 1 57 Treated Male 2 ...

  7. 关于mapState和mapMutations和mapGetters 和mapActions辅助函数的用法及作用(三)-----mapGetters

    简单的理解: const getters = { newCount: function(state){ return state.count += 5; } } ------------------- ...

  8. 面试必备【含答案】Java面试题系列(二

    1.写clone()方法时,通常都有一行代码,是什么?答:super.clone(),他负责产生正确大小的空间,并逐位复制. 2.GC 是什么? 为什么要有GC?答:GC 是垃圾收集的意思(Gabag ...

  9. python 内置2to3工具将python2代码转换为python3代码

    python2与python3代码不兼容,如果需要python2代码在python3环境下运行,需要将代码进行转换,本文介绍使用python3内置工具2to3.py对代码进行转换 一:2to3.py在 ...

  10. git 提交运用vim编辑器

    git  commit -m 默认使用nano,觉得不爽,改成vim吧.在 .gitconfig (在根目录下)的  [core] 段中加上 editor=vim . 或:$git config -- ...