基于flask 写的web_socket 单聊和群聊

群聊

from flask import Flask,request,render_template

from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket

app = Flask(__name__)

user_socket_list = []

@app.route("/conn_ws")
def ws_app():
    # print(request.environ)

    user_socket = request.environ.get("wsgi.websocket")  # type:WebSocket
    user_socket_list.append(user_socket)
    print(len(user_socket_list),user_socket_list)

    while True:
        msg = user_socket.receive()
        print(msg)

        for usocket in  user_socket_list:
            usocket.send(msg)

        # user_socket.send(msg)

    # 1 已经开启的websocket连接
    # 3 开启了websocket连接 然后 断开了

    # return "666"

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

if __name__ == ‘__main__‘:
    # app.run()
    http_serv = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler)
    http_serv.serve_forever()

群聊

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
<input type="text" id="send_str">
<button id="send_btn" onclick="send()">发送消息</button>
<p>
<div id="chat_list">

</div>
</p>
</body>
<script type="application/javascript">
    var ws = new WebSocket("ws://192.168.11.182:9527/conn_ws");
    ws.onmessage = function (messageEvent) {
        console.log(messageEvent.data);
        var ptag = document.createElement("p");
        ptag.innerText = messageEvent.data;
        document.getElementById("chat_list").appendChild(ptag);
    };

    // document.getElementById("send_btn").addEventListener("onclick",)
    function send() {
        var send_str = document.getElementById("send_str").value;
        ws.send(send_str);
    }
</script>
</html>

群聊前端代码

单聊

import json

from flask import Flask,request,render_template

from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket

app = Flask(__name__)

user_socket_dict = {}

@app.route("/conn_ws/<user_nick>")
def ws_app(user_nick):
    # print(request.environ)
    user_socket = request.environ.get("wsgi.websocket")  # type:WebSocket
    user_socket_dict[user_nick] = user_socket
    print(len(user_socket_dict),list(user_socket_dict.keys()))

    while True:
        msg = user_socket.receive()
        # {from_user:"alexDSB",to_user:"YWB",message:"666"}
        msg_dict = json.loads(msg)
        to_user = msg_dict.get("to_user")
        to_user_socket = user_socket_dict.get(to_user)
        to_user_socket.send(msg)

    # 1 已经开启的websocket连接
    # 3 开启了websocket连接 然后 断开了

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

if __name__ == ‘__main__‘:
    # app.run()
    http_serv = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler)
    http_serv.serve_forever()

单聊

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
<p><input type="text" id="nick"><button onclick="login()">登陆聊天室</button></p>
发送给:<input type="text" id="to_user">消息:<input type="text" id="send_str">
<button id="send_btn" onclick="send()">发送消息</button>
<p>
<div id="chat_list">

</div>
</p>
</body>
<script type="application/javascript">
    var ws = null;
    // ws.onopen = function(){
    //     ws.send("123");
    // }

    function login() {
        var nick = document.getElementById("nick").value;
        ws = new WebSocket("ws://192.168.11.182:9527/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);
        };
    }

    // document.getElementById("send_btn").addEventListener("onclick",)
    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,
            message:message
        };
        var json_send_str = JSON.stringify(send_str);
        ws.send(json_send_str);
    }
</script>
</html>

单聊前端代码

原文地址:https://www.cnblogs.com/awfj/p/10602761.html

时间: 2024-10-29 02:50:08

基于flask 写的web_socket 单聊和群聊的相关文章

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(三) 之 实现单聊,群聊,发送图片,文件。

上篇讲解了如何搭建聊天服务器,以及客户端js怎么和layui的语法配合.服务器已经连接上了,那么聊天还会远吗? 进入正题,正如上一篇提到的我们用 Client.Group(groupId)的方法向客户端推送消息.本篇就先不把业务搞复杂了,就默认现在两个用户都各自打开了对方的聊天窗口,那么聊天过程是这样的. 同理,B给A发消息也是这个流程,因为无论如何,A(ID)和B(ID)都会按照规则生成同一个组名.其中由于LayIM已经帮我们在客户端做好了发送消息并且将消息展示在面板上,所以我们要做的就是当接

基于Java NIO的多人在线聊天工具源码实现(登录,单聊,群聊)

近来在学习Java NIO网络开发知识,写了一个基于Java NIO的多人在线聊天工具练练手.源码公开在Coding上: https://coding.net/u/hust_wsh/p/MyChat/git ,开发环境是Ubuntu14.04+Eclipse Mars+JDK1.8. 要想编写一个基于Java NIO的多人在线聊天工具,我总结需要以下几方面的地址:客户端服务器模型,Java NIO中的Selector,SocketChannel,ByteBuffer,Collections以及序

基于netty实现单聊、群聊功能

学习资料 https://juejin.im/book/5b4bc28bf265da0f60130116/section/5b6a1a9cf265da0f87595521 收获: 1. Netty 是什么? 经过我们整个小册的学习,我们可以了解到,Netty 其实可以看做是对 BIO 和 NIO 的封装,并提供良好的 IO 读写相关的 API,另外还提供了非常多的开箱即用的 handler,工具类等等. 2. 服务端和客户端启动 Netty 提供了两大启动辅助类,ServerBootstrap

用flask写一个接单的接口

用falsk写一个简单的接口,这个接口的数据本来是爬虫爬取的数据,但是今天只写一个flask接口,数据就用测试数据好了. import random import re import time import requests import flask,json from flask import request server = flask.Flask(__name__) @server.route('/accessoriesName',methods = ['get','post']) def

IM群聊消息的已读回执功能该怎么实现?

本文引用了架构师之路公众号作者沈剑的文章,内容有改动,感谢原作者. 1.前言 我们平时在使用即时通讯应用时候,每当发出一条聊天消息,都希望对方尽快看到,并尽快回复,但对方到底有没有真的看到?我却并不知道. 一个残酷的现实是,很多时候对方其实是早就已经看到了这条消息,但出出种种原因(大家都懂的),通常都是默默返回--假装没看见. 像微信这样的熟人社交工具,在产品的设计理念上,为了保持使用者的隐私性,在线状态.已读回执等涉及隐私的功能,都没有提供.但很多时候,尤其商务.办公场合下,特别需要一种强反馈

个人微信群聊的实现

最近发现了一个很好的插件,插件可以绑定自己的个人微信,绑定微信之后就能快速接入一个机器人.其实和现在市面上的qq机器人类似,接入到微信中,可以做到单聊也可以在微信群中聊天. 下面就介绍这个插件怎么使用的 (1)插件可以去图灵机器人官网上进行下载http://tuling123.com/html/doc/weichat_robot.html (2)进入图灵机器人官网,注册并登入图灵账号,在个人中心板块的“机器人接入”页面获取图灵机器人key(该key作为识别每个用户的唯一标识) (3)下载解压之后

Flask 实现 WebSocket 通讯---群聊和私聊

一.WebSocket介绍 WebSocket是一种在单个TCP连接实现了服务端和客户端进行双向文本或二进制数据通信的一种通信的协议. WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输. 一次请求 - 服务器收到请求 开始和客户端握手 - 保持长连接 - 数据实时 - 连接永远保持 优点:长连接 并且不影响 收发请求 缺点:连接保

websocket实现群聊和单聊(转)

昨日内容回顾 1.Flask路由 1.endpoint="user" # 反向url地址 2.url_address = url_for("user") 3.methods = ["GET","POST"] # 允许请求进入视图函数的方式 4.redirect_to # 在进入视图函数之前重定向 5./index/<nid> # 动态参数路由 <int:nid> def index(nid) 6.str

基于flask的网页聊天室(二)

基于flask的网页聊天室(二) 前言 接上一次的内容继续完善,今天完成的内容不是很多,只是简单的用户注册登录,内容具体如下 具体内容 这次要加入与数据哭交互的操作,所以首先要建立相关表结构,这里使用flask-sqlalchemy来辅助创建 首先修改之前的init文件为: from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() from web_chatroom.models impor