web_socket+Flask实现网页版聊天
服务器端:
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 = {}
# user_socket_dict = []
@app.route('/conn_ws/<user>')
def ws_app(user):
# print(request.environ)
'''
ws://
{'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_SOFTWARE': 'gevent/1.4 Python/3.7', 'SCRIPT_NAME': '',
'wsgi.version': (1, 0), 'wsgi.multithread': False, 'wsgi.multiprocess': False,
'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'SERVER_NAME': 'changtao', 'SERVER_PORT': '9527', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/conn_ws', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.1',
'REMOTE_ADDR': '192.168.11.181', 'REMOTE_PORT': '58068', 'HTTP_HOST': '192.168.11.181:9527',
'HTTP_CONNECTION': 'Upgrade', 'HTTP_PRAGMA': 'no-cache', 'HTTP_CACHE_CONTROL': 'no-cache',
'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36', 'HTTP_UPGRADE': 'websocket',
'HTTP_ORIGIN': 'http://localhost:63342', 'HTTP_SEC_WEBSOCKET_VERSION': '13', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9,en;q=0.8', 'HTTP_SEC_WEBSOCKET_KEY': 'p1otMQwA0qQcMd3FEJ5Kaw==',
'HTTP_SEC_WEBSOCKET_EXTENSIONS': 'permessage-deflate; client_max_window_bits',
'wsgi.input': <gevent.pywsgi.Input object at 0x0000023F6943A588>, 'wsgi.input_terminated': True, 'wsgi.websocket_version': '13',
'wsgi.websocket': <geventwebsocket.websocket.WebSocket object at 0x0000023F69377AD8>,
'werkzeug.request': <Request 'http://192.168.11.181:9527/conn_ws' [GET]>}
'''
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket
# user_socket_dict.append(user_socket)
user_socket_dict[user] = user_socket
print(len(user_socket_dict), user_socket_dict)
while True:
msg = user_socket.receive()
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)
# for i in user_socket_dict:
# i.send(msg)
@app.route("/")
def index():
return render_template("my_ws.html")
if __name__ == '__main__':
http_serv = WSGIServer(("0.0.0.0", 9527), app, handler_class=WebSocketHandler) # 如果不是http请求,就交给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 οnclick="login()">登陆聊天室</button></p>
<p>发送给谁:<input type="text" id="to_user"></p>
<p>
消息:<input type="text" id="send_msg">
<button id="send_btn" οnclick="send()">发送消息</button>
</p>
<div id="show_msg">
</div>
</body>
<script type="text/javascript">
var ws = null;
{#var ws = new WebSocket("ws://192.168.11.181:9527/conn_ws");#}
{#ws.onmessage=function (messageEvent) {#}
{# console.log(messageEvent.data);};#}
{#var ws = new WebSocket("ws://192.168.11.181:9527/conn_ws");#}
function login() {
var nick = document.getElementById("nick").value;
ws = new WebSocket("ws://192.168.11.181: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 ;
{#ptag.innerText =message.message;#}
document.getElementById("show_msg").appendChild(ptag);
};}
function send() {
var message = document.getElementById("send_msg").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);
var ptag = document.createElement("p");
ptag.innerText =document.getElementById("nick").value + " : " + message;
document.getElementById("show_msg").appendChild(ptag);
}
</script>
</html>