博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flask-websocket实现聊天功能
阅读量:4627 次
发布时间:2019-06-09

本文共 5245 字,大约阅读时间需要 17 分钟。

群聊无昵称

原生js代码

  
群聊

后端逻辑代码

# -*- coding: utf-8 -*-# @Time    : 2019/7/15 16:42from flask import render_template,request,Flaskfrom geventwebsocket.handler import WebSocketHandler  # 提供WS协议处理from geventwebsocket.server import WSGIServer # 承载服务from geventwebsocket.websocket import WebSocket  # 语法提示app = Flask(__name__)user_socket_list = []@app.route("/my_socket")def my_socket():    # 获取当前客户端与服务器的Socket连接    user_socket = request.environ.get("wsgi.websocket")  # type:WebSocket    if user_socket:            user_socket_list.append(user_socket)            print(len(user_socket_list),user_socket_list)        # 1 [
] # print(user_socket,"OK 连接已经建立好了,接下来发消息吧") while 1: # 等待前端将消息发送过来 msg = user_socket.receive() print(msg) for usocket in user_socket_list: try: usocket.send(msg) except: continue@app.route("/qunliao")def gc(): return render_template("qunliao.html")if __name__ == '__main__': http_serv = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler) # 这种启动方式和app.run()不冲突,该启动方式发什么请求都可以接受到 http_serv.serve_forever()

流程

1、用户在网页请求http://192.168.16.42:9527/qunliao2、请求/qunliao这个路由走后端对应的视图函数gc返回qunliao.html这个页面,3、页面在加载的过程中走到script代码时建立WebSocket连接请求ws://192.168.16.42:9527/my_socket,4、ws://192.168.16.42:9527/my_socket请求走后端对应的视图函数,获取当前客户端与服务器的socket连接对象,调用该对象的receive方法,等待前端发来消息,5、前端我们通过给input框绑定点击事件,获取用户输入的内容发送给服务器;6、后端将前端发来的消息在发送给前端;7、前端通过ws.onmessage这个事件监听着后端过来的消息,只要有消息就会自动触发函数执行并获取数据;

第一步是浏览器向/quliao这个路径发起请求:

jQuery

  
群聊

前端代码
from flask import render_template,request,Flaskfrom geventwebsocket.handler import WebSocketHandler  # 提供WS协议处理from geventwebsocket.server import WSGIServer # 承载服务from geventwebsocket.websocket import WebSocket  # 语法提示app = Flask(__name__,static_folder="statics",static_url_path="/static")  # 获取静态文件user_socket_list = []@app.route("/my_socket")def my_socket():    # 获取当前客户端与服务器的Socket连接    user_socket = request.environ.get("wsgi.websocket")  # type:WebSocket    if user_socket:            user_socket_list.append(user_socket)            print(len(user_socket_list),user_socket_list)        # 1 [
] # print(user_socket,"OK 连接已经建立好了,接下来发消息吧") while 1: # 等待前端将消息发送过来 msg = user_socket.receive() print(msg) for usocket in user_socket_list: try: usocket.send(msg) except: continue@app.route("/qunliao")def gc(): return render_template("qunliao.html")if __name__ == '__main__': http_serv = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler) http_serv.serve_forever()
后端代码

带群昵称的群聊

通过动态路由参数获取前端传过来的用户名

  
群聊

前端代码
from flask import render_template,request,Flaskfrom geventwebsocket.handler import WebSocketHandler  # 提供WS协议处理from geventwebsocket.server import WSGIServer # 承载服务from geventwebsocket.websocket import WebSocket  # 语法提示app = Flask(__name__,static_folder="statics",static_url_path="/static")user_socket_dict = {}# 建立websocket连接时,前端将名字发送过来了@app.route("/my_socket/
")def my_socket(username): # 获取当前客户端与服务器的Socket连接 user_socket = request.environ.get("wsgi.websocket") # type:WebSocket if user_socket: # 以名字为key,连接对象为value添加到字典中 user_socket_dict[username] = user_socket while 1: # 等待前端将消息发送过来,此时是json数据 msg = user_socket.receive() for usocket in user_socket_dict.values(): try: # 将收到的信息在发送给所有与服务器建立连接的前端 usocket.send(msg) except: continue@app.route("/qunliao")def gc(): return render_template("qunliaonicheng.html")if __name__ == '__main__': http_serv = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler) http_serv.serve_forever()
后端代码

效果:

websocket实现私聊

  
群聊我的昵称:

发送

前端页面
import jsonfrom flask import render_template,request,Flaskfrom geventwebsocket.handler import WebSocketHandler  # 提供WS协议处理from geventwebsocket.server import WSGIServer # 承载服务from geventwebsocket.websocket import WebSocket  # 语法提示app = Flask(__name__,static_folder="statics",static_url_path="/static")user_socket_dict = {}# 建立websocket连接时,前端将名字发送过来了@app.route("/my_socket/
")def my_socket(username): # 获取当前客户端与服务器的Socket连接 user_socket = request.environ.get("wsgi.websocket") # type:WebSocket if user_socket: # 以名字为key,连接对象为value添加到字典中 user_socket_dict[username] = user_socket while 1: # 等待前端将消息发送过来,此时是json数据 msg = user_socket.receive() print(msg) # {"from_user":"wuchao","chat":"123","to_user":"xiaohei"} # 反序列化 msg_dict = json.loads(msg) # 查找字典中前端要发送信息给那个人的名字 to_username = msg_dict.get("to_user") # 获取目标人物的连接地址 to_user_socket = user_socket_dict.get(to_username) # 将信息发送给目标人物 to_user_socket.send(msg)@app.route("/siliao")def gc(): return render_template("siliao.html")if __name__ == '__main__': http_serv = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler) http_serv.serve_forever()
后端代码

效果

 

转载于:https://www.cnblogs.com/songzhixue/p/11190512.html

你可能感兴趣的文章
C# LINQ学习笔记
查看>>
如何解决安卓SDK无法下载Package的问题
查看>>
我的知识组织管理
查看>>
gradle spring boot构建项目
查看>>
MTK 修改默认屏幕亮度
查看>>
进程间的几种通信方式
查看>>
纯CCS绘制三角形箭头图案
查看>>
eclipse常见错误
查看>>
c++ string转char*
查看>>
eclipse 创建maven 项目 动态web工程完整示例
查看>>
大道至简读后感以及JAVA伪代码
查看>>
bfs记录路径,蓝桥杯真题
查看>>
2018.09.27 bzoj3029: 守卫者的挑战(概率dp)
查看>>
winXP启用SSL方式IIS
查看>>
java类路径classpath和包
查看>>
Oracler读取各种格式的相关日期格式
查看>>
Python学习札记(三十六) 面向对象编程 Object Oriented Program 7 __slots__
查看>>
iOS 时间和时间戳之间转化
查看>>
【整理】C#文件操作大全(SamWang)
查看>>
如何从数据库生成 EF Code First model
查看>>