Flask基于websocket的简单聊天室

1、安装gevent-websocket

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gevent-websocket

2、chat.py文件内容如下:

from flask import Flask,request,render_template
import json
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket

user_dict = {}

chat_app = Flask(__name__)
@chat_app.route(‘/ws/<username>‘)
def ws_chat(username):
    user_socket = request.environ.get(‘wsgi.websocket‘) # type:WebSocket
    user_dict[username]=user_socket
    while 1:
        msg = user_socket.receive()  # 等待接收客户端发来的数据
        msg_dict = json.loads(msg)
        msg_dict[‘from_user‘] = username
        to_user = msg_dict.get(‘to_user‘)
        if to_user == "":  # 如果用户名是空表示群发
            for uname, uwebsocket in user_dict.items():
                if uname == username:  # 群发时不用给自己发
                    continue
                uwebsocket.send(json.dumps(msg_dict))
            continue
        to_user_socket = user_dict.get(to_user)
        if not to_user_socket:  # 判断用户字典中是否存在用户的websocket连接
            continue
        try:
            msg_dict[‘from_user‘] = msg_dict[‘from_user‘] + ‘@私聊我‘
            to_user_socket.send(json.dumps(msg_dict))
        except:
            user_dict.pop(to_user)

@chat_app.route(‘/webchat‘)
def webchat():
    return render_template(‘public_chat.html‘)

if __name__ == ‘__main__‘:
    server = WSGIServer((‘0.0.0.0‘,9527),chat_app,handler_class=WebSocketHandler)
    server.serve_forever()

3、web_chat.html文件部分内容如下:

<p>你的名字:<input type="text" id="username">
    <button onclick="open_ws()">登陆聊天室</button>
</p>
<form onsubmit="return false;">
    <h3>WebSocket 聊天室:</h3>
    <textarea id="responseText" style="width: 500px; height: 300px;"></textarea>
    <br>
    给:<input type="text" id="to_user">消息内容:<input type="text" id="message">
    <input type="button" value="发送消息" onclick="send_msg()">
    <input type="button" onclick="javascript:document.getElementById(‘responseText‘).value=‘‘"
           value="清空聊天记录">
</form>

4、js代码如下:

<script type="application/javascript">
    var ws = null;
    function open_ws() {
        var username = document.getElementById(‘username‘).value;
        ws = new WebSocket("ws://192.168.16.239:9527/ws/" + username);
        ws.onopen = function () {
            alert("登陆成功");
        };

        ws.onmessage = function (eventMessage) {
            // 显示消息记录
            var chat = JSON.parse(eventMessage.data);
            console.log(chat);
            var chat_content = document.getElementById(‘responseText‘);
            chat_content.value = chat_content.value + "\n" + chat.from_user + " : " + chat.chat;
        };
    }

    function send_msg() {
        // 发送消息
        var to_user = document.getElementById("to_user").value;
        var msg = document.getElementById("message").value;
        var send_str = {
            to_user: to_user,
            chat: msg
        };
        ws.send(JSON.stringify(send_str));
        var chat_content = document.getElementById("responseText");
        chat_content.value = chat_content.value + "\n" + "我: " + msg;
    }
</script>

最终的效果图如下:

原文地址:https://www.cnblogs.com/caesar-id/p/10975452.html

时间: 2024-08-22 19:23:07

Flask基于websocket的简单聊天室的相关文章

分享基于 websocket 网页端聊天室

博客地址:https://ainyi.com/#/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websocket 网页端聊天室 WebSocket 协议是基于 TCP 的一种新的网络协议.它实现了浏览器与服务器全双工 (full-duplex) 通信--允许服务器主动发送信息给客户端. 使用 java 开发后台 需要导入一个jar包:javax.websocket-api-1.0-rc4.jar 后台

.NET Core 基于Websocket的在线聊天室

什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后就会断开连接. 在没有websocket之前web系统如果要做双工通讯往往使用http long polling技术.http long polling 每次往服务器发送请求后,服务端不会立刻返回信息来结束请求,而是一直挂着直到有数据需要返回,或者等待超时了才会返回.客户端在结束上一次请求后立刻再发

用swoole和websocket开发简单聊天室

首先,我想说下写代码的一些习惯,第一,任何可配置的参数或变量都要写到一个config文件中.第二,代码中一定要有日志记录和完善的报错并记录报错.言归正传,swoole应该是每个phper必须要了解的,它号称重新定义了php.此聊天室利用了swoole高并发并且异步非阻塞的特点提高了程序的性能. 首先,定义一个 swoole_lock 和 swoole_websocket_server ,并且配置参数,具体参数详情可以去swoole官网查看. public function start(){ $t

基于Twisted的简单聊天室

实现了私聊,公聊.用户名密码存在redis.为了拓展,做了简单的模块. #coding=utf8 from twisted.internet import reactor, defer from twisted.protocols.basic import LineReceiver from twisted.internet.protocol import Factory, Protocol, ServerFactory import redis class Server(ServerFacto

基于GUI的简单聊天室01

运用了Socket编程,gui,流的读入和写出,线程控制等 思路: 1.首先是在客户端中先建立好聊天的GUI 2.建立服务器端,设置好端口号(用SocketServer),其中需要两个boolean变量来分别表示服务器是否已经开启和是否有客户端连接进来, 利用while循环来让服务器在开启的情况下不断接收客户端的信息.利用DataOutputStream来进行通讯 3.客户端连接服务器(Socket) 首先是客户端的类 1 import java.awt.BorderLayout; 2 impo

基于GUI的简单聊天室02

服务器端 与上一篇相比,加进了线程内部类,解决多个客户端连接时,服务器无法全部响应的问题. 利用List集合来装载客户端的对象. 还需要注意全局变量的应用. 1 /** 2 * 相比01,加进了线程内部类,解决多个客户端连接时,服务器无法全部响应的问题. 3 * @author Administrator 4 * 5 */ 6 7 import java.io.DataInputStream; 8 import java.io.DataOutputStream; 9 import java.io

使用WebSocket实现网页聊天室

知道WebSocket挺久了,但是一直没提起兴趣去了解它. 今天听@成熟的毛毛虫 说到slack.小小的试用了一下,发现slack的聊天功能做得相当强大,看了下网络请求,发现是基于WebSocket实现的.顿时提起兴趣,想了解下这强大的WebSocket. 先了解下WebSocket. 开源中国的介绍:http://www.oschina.net/p/websocket 百度百科的介绍:http://baike.baidu.com/link?url=yMTBVobtkp1E1a0wrRJlnEX

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室.

基于html5 localStorage , web SQL, websocket的简单聊天程序

new function() { var ws = null; var connected = false; var serverUrl; var connectionStatus; var sendMessage; var connectButton; var disconnectButton; var sendButton; var open = function() { var url = serverUrl.val(); ws = new WebSocket(url); ws.onope