Flask-websocket实现聊天功能

摘要:
没有昵称的群聊原生js代码˂!
群聊无昵称

原生js代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>群聊</title>
</head>
<body>
<p>
    <input type="text" id="content">
    <button onclick="send_msg()">发送</button> <!--给按钮绑定点击事件-->
</p>

<div id="chat_list">

</div>
</body>
<script type="application/javascript">
  var ws = new WebSocket("ws://192.168.16.42:9527/my_socket");
  // 监听后端发来的消息,ws.onmessage起到监听的作用,只要有消息过来函数会自动执行
  ws.onmessage = function (eventMessage) {
      console.log(eventMessage.data); // 获取后端发来的消息
      var p = document.createElement("p");
      p.innerText = eventMessage.data;
      document.getElementById("chat_list").appendChild(p); // 将消息内容添加到div内
  };
  // 将我们输入的内容发送给后端
  function send_msg() {
      var content = document.getElementById("content").value;
      ws.send(content);
  };

</script>
</html>

后端逻辑代码

# -*- coding: utf-8 -*-
# @Time    : 2019/7/15 16:42

from flask import render_template,request,Flask
from 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 [<geventwebsocket.websocket.WebSocket object at 0x000001D0D70E1458>]
        # 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/qunliao
2、请求/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这个路径发起请求:

Flask-websocket实现聊天功能第1张

jQuery

Flask-websocket实现聊天功能第2张Flask-websocket实现聊天功能第3张
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>群聊</title>
</head>
<body>
<p>
    <input type="text" id="content">
    <button id="send_msg" >发送</button> <!--给按钮绑定点击事件-->
</p>

<div id="chat_list">

</div>
</body>
<script src="/static/jquery-3.4.1.js"></script>
<script type="application/javascript">
    var ws = new WebSocket("ws://192.168.16.42:9527/my_socket");
    // 监听后端发来的消息,ws.onmessage起到监听的作用,只要有消息过来函数会自动执行
    ws.onmessage = function (eventMessage) {
      console.log(eventMessage.data);       // 获取后端发来的消息
      var p = document.createElement("p"); // 创建一个p标签
      p.innerText = eventMessage.data;     // 将后端发来的数据添加到p标签内
      $("#chat_list").append(p)            // 将p标签添加到div内
    };
  // 将我们输入的内容发送给后端
    $("#send_msg").click(function () {
        var content = $("#content").val();
        ws.send(content);
    })
</script>
</html>
前端代码
Flask-websocket实现聊天功能第4张Flask-websocket实现聊天功能第5张
from flask import render_template,request,Flask
from 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 [<geventwebsocket.websocket.WebSocket object at 0x000001D0D70E1458>]
        # 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()
后端代码
带群昵称的群聊

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

Flask-websocket实现聊天功能第6张Flask-websocket实现聊天功能第7张
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>群聊</title>
</head>
<body>
<input type="text" id="username">
<button id="login">登录</button>
<p>
    <input type="text" id="content">
    <button id="send_msg" >发送</button> <!--给按钮绑定点击事件-->
</p>

<div id="chat_list">

</div>
</body>
<script src="/static/jquery-3.4.1.js"></script>
<script type="application/javascript">
    var ws = null; // 创建全局变量,ws多处使用

    $("#login").click(function () {
         var username = $("#username").val();
         console.log(username);
         // 创建一个websocket对象,建立websocket连接,更改了全局的ws,将用户名拼接上
         ws = new WebSocket("ws://192.168.16.42:9527/my_socket/" + username);

        // 监听后端发来的消息,ws.onmessage起到监听的作用,只要有消息过来函数会自动执行
        ws.onmessage = function (eventMessage) {
            console.log(eventMessage.data);       // 获取后端发来的消息
            var str_obj = JSON.parse(eventMessage.data);  // 反序列化,因为我们在发送给后端的时候是json
            var p = document.createElement("p"); // 创建一个p标签
            $(p).text(str_obj.from_user +":"+str_obj.chat);     // 将dom对象转换成jQuery对象,将后端发来的数据添加到p标签内
            $("#chat_list").append(p)            // 将p标签添加到div内
        };
    });

    // 将我们输入的内容发送给后端
    $("#send_msg").click(function () {
        var content = $("#content").val();
        var username = $("#username").val();
        // 将要发送的内容封装成自定义对象
        var sendStr = {
            from_user:username,
            chat:content
        };
        console.log(sendStr);
        // 序列化后发送给后端
        ws.send(JSON.stringify(sendStr));
    });
</script>
</html>
前端代码
Flask-websocket实现聊天功能第8张Flask-websocket实现聊天功能第9张
from flask import render_template,request,Flask
from 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/<username>")
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()
后端代码

效果:

Flask-websocket实现聊天功能第10张

websocket实现私聊
Flask-websocket实现聊天功能第11张Flask-websocket实现聊天功能第12张
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>群聊</title>
</head>
<body>
我的昵称:<input type="text" id="username">
<button id="login">登录</button>
<p><input type="text" id="to_user">发送
    <input type="text" id="content">
    <button id="send_msg" >发送</button> <!--给按钮绑定点击事件-->
</p>

<div id="chat_list">

</div>
</body>
<script src="/static/jquery-3.4.1.js"></script>
<script type="application/javascript">
    var ws = null; // 创建全局变量,ws多处使用

    $("#login").click(function () {
         var username = $("#username").val();
         console.log(username);
         // 创建一个websocket对象,建立websocket连接,更改了全局的ws,将用户名拼接上
         ws = new WebSocket("ws://192.168.16.42:9527/my_socket/" + username);

        // 监听后端发来的消息,ws.onmessage起到监听的作用,只要有消息过来函数会自动执行
        ws.onmessage = function (eventMessage) {
            console.log(eventMessage.data);       // 获取后端发来的消息
            var str_obj = JSON.parse(eventMessage.data);  // 反序列化,因为我们在发送给后端的时候是json
            var p = document.createElement("p"); // 创建一个p标签
            $(p).text(str_obj.from_user +":"+str_obj.chat);     // 将dom对象转换成jQuery对象,将后端发来的数据添加到p标签内
            $("#chat_list").append(p)            // 将p标签添加到div内
        };
    });

    // 将我们输入的内容发送给后端
    $("#send_msg").click(function () {
        var content = $("#content").val();
        var username = $("#username").val();
        var to_user = $("#to_user").val();
        // 将要发送的内容封装成自定义对象
        var sendStr = {
            from_user:username,
            chat:content,
            to_user:to_user,
        };
        console.log(sendStr);
        // 序列化后发送给后端
        ws.send(JSON.stringify(sendStr));
    });
</script>
</html>
前端页面
Flask-websocket实现聊天功能第13张Flask-websocket实现聊天功能第14张
import json
from flask import render_template,request,Flask
from 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/<username>")
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()
后端代码

效果

Flask-websocket实现聊天功能第15张

免责声明:文章转载自《Flask-websocket实现聊天功能》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!NativeCode中通过JNI反射调用Java层的代码,以获取IMEI为例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

手机上移动梦网中毒啦!病毒名字叫:程序管理 版本0.1.1 defwatch!找到删除它的简单方法!

我的手机型号:N70,S60 2rd 上移动梦网中毒啦!病毒名字叫:程序管理 版本0.1.1 defwatch 真是恶心啊,不知道是他们自己放的,还是别人放的?  病毒名字叫:程序管理 版本0.1.1 defwatch 的解决办法! 我找到一个比较简单的方法,自己就是这样把defwatch病毒删除的: 在手机开机后乱按键盘,我主要是按了方向键和左右的几个...

Mysql----mysql启动服务时提示"服务名无效"

1,首先说明一下我的环境,我刚开始是用的XAMPP这个集成的软件,里面安装了apache, mysql,tomcat这些软件,然后通过控制面板对其进行启动关闭的操作,这些操作很方便,但是我就用net start mysql,这时出现了“服务名无效” 问题原因:mysql服务没有安装。 解决办法: 在 mysql bin目录下 以管理员的权限 执行 mys...

Win10解除UWP应用网络隔离从而允许访问代理

前言 当开启代理时,win10的uwp应用无法联网。其根本原因是UWP沙箱环境默认不与本地网络联通。 默认情况下,Windows Metro内置UMP应用是不允许访问localhost的,所以会导致无法通过代理添加Gmail邮箱、Microsoft Store无法联网等。通过Windows 10自带的CheckNetIsolation.exe程序可以解除网...

phonegap学习入门

phonegap 开发入门 PhoneGap官方网站上有详细的入门示例教程,这里,我针对使用PhoneGap进行Android移动应用的开发对其官网的Get Started进行一些介绍、补充。 Step1、选择你想要进行开发的移动平台,点击Android图标 Step2、需要安装的软件-Eclipse3.4以上版本 Step3、安装SDK+Phone...

两台电脑件通过网线进行屏幕扩展

如果有两台笔记本电脑(台式也适用)想把另一台用作扩展屏该怎么办呢? 我在网上查了很多方法和软件,可以在硬件上用采集卡或外接显卡,但成本太贵不划算。然后也试了下软件的虽然是可以进行扩展,但是这些软件都是采用无线连接的,由于我的wifi不好所以 延时普遍都太高了;不是画面卡,就是画质差。只能用来尝鲜体验下,实用性不高。 后来自己折腾了下,不使用无线进行连接了,...

iOS企业级应用打包与部署

>iOS企业级的打包与部署相关小细节记录,主要是记录下plist文件的格式,便于以后使用的时候方便的找到。<!--more--> iOS企业级打包的相关前提: 1. 一个企业级iOS开发者账号。 2. 申请发布证书xxx_distribute.cer(主证书) 3. 申请企业打包发布证书xxx_distribute.provision(副...