当前位置: 首页 > news >正文

websocket 二合一

server

from flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket
import json
app = Flask(__name__)

user_socket_dict = {}  # 字典

@app.route('/conn_ws/<user_nick>')  #http 协议,
def ws_app(user_nick):

    user_socket = request.environ.get('wsgi.websocket')  #type:WebSocket
    user_socket_dict[user_nick] = user_socket  # { 昵称:user信息 }
    print(len(user_socket_dict), list(user_socket_dict.keys()))

    while True:    # user_socket 是一个内存地址
        msg =  user_socket.receive()  #  hang 住了
        msg_dict = json.loads(msg)

        to_user = msg_dict.get('to_user')
        if to_user == 'all':
            for ss in list(user_socket_dict.values()):
                ss.send(msg)

        else:

            to_user_socket =  user_socket_dict.get(to_user)
            to_user_socket.send(msg)

@app.route('/')
def index():
    return render_template('my_ws.html')

if __name__ == '__main__':
    # app.run()
    http_ser = WSGIServer(('0.0.0.0',9009),app,handler_class=WebSocketHandler)  # 应用程序网关接口
    http_ser.serve_forever()

页面 html  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>单聊</title>
</head>
<body>
<p><input type="text" id="nick">
    <button onclick="login()">登陆聊天室</button>
</p>

发送给: <input type="text" id="to_user" placeholder="找谁聊?"> 消息: <input type="text" id="send_str">

<button id="sin_btn" onclick="sin_send()">发消息</button>
<button id="send_btn" onclick="send()">群聊发消息</button>

<p>
<div id="chat_list">
</div>
</p>

</body>
<script type="text/javascript">
    var ws = null;  //公共变量,

    function login() {
        var nick = document.getElementById('nick').value;
        ws = new WebSocket('ws://192.168.11.94:9009/conn_ws/' + nick); //登录时候创建连接
        ws.onmessage = function (messageEvent) {                           //等待消息
            console.log(messageEvent.data);
            var ptag = document.createElement('p');
            var message = JSON.parse(messageEvent.data);

            ptag.innerText = message.from_user + ' : ' + message.message;
            document.getElementById('chat_list').appendChild(ptag);
        };
    }

    function send() {
        var message = document.getElementById('send_str').value;
        var send_str = {
            from_user: document.getElementById('nick').value,
            // to_user:document.getElementById('to_user').value,
            to_user: 'all',   // 群聊
            message: message
        };
        var json_str = JSON.stringify(send_str);
        ws.send(json_str);
    }

    function sin_send() {
        var message = document.getElementById('send_str').value;
        var send_str = {
            from_user: document.getElementById('nick').value,
            to_user:document.getElementById('to_user').value,

            message: message
        };
        var json_str = JSON.stringify(send_str);
        ws.send(json_str);
    }

    // js代码是异步代码;
</script>
</html>

 

转载于:https://www.cnblogs.com/zhangchen-sx/p/10626882.html

相关文章:

  • Python入门教程100天:Day05-练习总结
  • vue-cli3 less全局变量使用
  • 日常压测流程
  • java冒泡排序 常规排序和优化排序
  • Chef宣布100%开源,要走红帽模式?\n
  • Go语言入门之指针的使用
  • Oracle redo解析之-4、rowid的计算
  • D语言/DLang 2.085.1 发布,修复性迭代
  • D3.js入门
  • 数据结构中的各种树简单解释
  • 世界冠军之路:菜鸟车辆路径规划求解引擎研发历程
  • shiro app
  • 控制台报错 index:0,size:0
  • 14Linux_BIND-Linux就该这么学
  • WordPress 5.2 Beta 3 发布,要求 PHP 5.6.20 以上版本
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Javascript 原型链
  • JavaScript-Array类型
  • Java基本数据类型之Number
  • JSONP原理
  • Unix命令
  • 阿里云应用高可用服务公测发布
  • 番外篇1:在Windows环境下安装JDK
  • 分类模型——Logistics Regression
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 两列自适应布局方案整理
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 探索 JS 中的模块化
  • 阿里云API、SDK和CLI应用实践方案
  • ​flutter 代码混淆
  • $GOPATH/go.mod exists but should not goland
  • (12)Linux 常见的三种进程状态
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (四)linux文件内容查看
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)程序员疫苗:代码注入
  • (转)视频码率,帧率和分辨率的联系与区别
  • .apk 成为历史!
  • .NET gRPC 和RESTful简单对比
  • .NET简谈设计模式之(单件模式)
  • .net与java建立WebService再互相调用
  • .NET值类型变量“活”在哪?
  • .py文件应该怎样打开?
  • /etc/sudoers (root权限管理)
  • /etc/sudoer文件配置简析
  • @private @protected @public
  • @SpringBootApplication 包含的三个注解及其含义
  • [ C++ ] STL---string类的模拟实现
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [202209]mysql8.0 双主集群搭建 亲测可用