使用genvent.socket实施群聊/单聊模式

使用genvent.socket实施群聊
from flask import Flask, request, render_template
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.websocket import WebSocket

import json
user_dict = {}                           #设置一个公共变量
app = Flask(__name__)
@app.route('/ws/<username>')
def ws(username):
    user_socket = request.environ.get('wsgi.websocket')            #获取客户端的服务
    user_dict[username] = user_socket                  #将其存到公共变量中
    while True:
        msg = user_socket.receive()    #等待接受客户端数据        
        u_msg= {'from_user':username,'chat':msg}            #将接收的数据进行处理(处理成字典)
        for uname,usocket in user_dict.items():            #循环发送向每个服务器进行发送数据
            usocket.send(json.dumps(u_msg))
@app.route('/webchat')
def webchat():
    return render_template('wechats.html')


if __name__ == '__main__':
    server = WSGIServer(('0.0.0.0',9527),app,handler_class=WebSocketHandler)  #设置ip 以及端口 还有处理方式
    server.serve_forever()            #运行服务

html文件代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>姓名: <input type="text" id="username">
    <button onclick="open_ws()">登录</button></p>
<p>内容: <input type="text" id="message">
    <button onclick="send_msg()">发送</button></p>
<div id="chat_list"></div>

</body>
<script type="application/javascript">
    var ws = null;
    function open_ws(){
        var username = document.getElementById("username").value;
        ws = new WebSocket('ws://192.168.16.234:9527/ws/'+username);
        ws.onopen=function(){
            alert('欢迎登录');
        };
        ws.onmessage=function(eventMessage){
            var chat = JSON.parse(eventMessage.data);
            var p =document.createElement("p");
            p.innerText=chat.from_user+':'+chat.chat;
            document.getElementById('chat_list').appendChild(p);
        }
    }
    function send_msg(){
        var msg=document.getElementById('message').value;
        ws.send(msg)
    }
</script>
</html>

 

 

使用genvent.socket实施单聊模式

import json
from flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
user_dict = {}
app= Flask(__name__)
@app.route('/my_ws/<username>')
def my_ws(username):
    user_socket=request.environ.get('wsgi.websocket')
    print(user_socket)
    user_dict[username] = user_socket
    while True:
        msg = user_socket.receive()
        msg_dict=json.loads(msg)
        msg_dict['from_user'] = username
        to_user = msg_dict.get('to_user')
        usocket= user_dict.get(to_user)
        if not usocket:
            continue
        try:
            usocket.send(json.dumps(msg_dict))
        except:
            user_dict.pop(to_user)

@app.route('/wechat')
def wechat():
    return render_template('personal.html')

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

html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="chat_list"></div>
<p>你的名字<input type="text" id="username">
<button onclick="open_ws()">登录</button></p>
<p>给: <input type="text" id="to_user"></p>
<p><input type="text" id="message"> <button onclick="send_msg()">发送</button></p>

</body>
<script type="application/javascript">
    var ws = null;
    function open_ws() {
        var username = document.getElementById("username").value;
        ws = new WebSocket("ws://192.168.16.234:9527/my_ws/"+username);
        ws.onopen = function () {
            alert("欢迎登录");
        };
        ws.onmessage = function (eventMessage) {
            var chat = JSON.parse(eventMessage.data);
            var p = document.createElement("p");
            p.innerText = chat.from_user + ":" + chat.chat;
            document.getElementById("chat_list").appendChild(p);
        };
    }
    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 p = document.createElement("p");
        p.innerText = "我:" + msg;
        document.getElementById("chat_list").appendChild(p);
    }
</script>
</html>

 

上一篇:C++ 并发进阶:std:thread 那些事


下一篇:Flask基于websocket的简单聊天室