使用genvent.socket实施群聊/单聊模式
Posted shicongcong0910
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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>
以上是关于使用genvent.socket实施群聊/单聊模式的主要内容,如果未能解决你的问题,请参考以下文章