简单的Websocket
from flask import Flask,request
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket #语法提示用的
app = Flask(__name__)
#wsgi.websocket socke-> socket链接 可以用来收发消息
@app.route("/ws")
def ws():
user_socket = request.environ.get("wsgi.websocket") #type:WebSocket
msg = user_socket.receive()
print(msg)
return ":123"
if __name__ == '__main__':
http_serv = WSGIServer(("0.0.0.0",5000),app,handler_class=WebSocketHandler)
http_serv.serve_forever()
之后就可以做一个简单的通话了
那么我们应该如何通过Websocket来实现群聊呢?
我们需要记录每一个连上来的人的socket链接,然后加入到列表里面,之后循环该列表,将给不是自己的socket链接发送消息,这就是具体的思路,下面是代码的实现流程。
"""
@author: Yxinmiracle
@project: f
@file: s1.py
@time: 2020/3/9 12:30
@desc:
/*code is far away from bug with the animal protecting
"""
from flask import Flask,request,render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket #语法提示用的
import json
app = Flask(__name__)
#wsgi.websocket socke-> socket链接 可以用来收发消息
#拿到socket链接就可以进行通讯了
user_socket_list = []
@app.route("/ws")
def ws():
user_socket = request.environ.get("wsgi.websocket") #type:WebSocket
user_socket_list.append(user_socket)
print(len(user_socket_list))
while 1:
try:
msg = user_socket.receive()
for socket in user_socket_list:
if socket != user_socket:
#print(msg)
socket.send(msg)
except:
user_socket_list.remove(user_socket)
@app.route('/chat')
def chat():
return render_template("ws.html")
if __name__ == '__main__':
http_serv = WSGIServer(("0.0.0.0",5000),app,handler_class=WebSocketHandler)
http_serv.serve_forever()
下面是前端代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="chat" style="width: 500px;height: 500px;">
<p>发送消息:<input type="text" id="msg"><button onclick="send_msg()">发送</button></p>
</div>
</body>
<script type="text/javascript">
var ws = new WebSocket("ws://192.168.....:5000/ws");
ws.onmessage = function (data) {
// var msg = JSON.parse(data.data);
console.log(data.data);
var ptag = document.createElement("p");
ptag.innerText = data.data;
document.getElementById("chat").appendChild(ptag);
};
function send_msg() {
var msg = document.getElementById("msg").value;
ws.send(msg);
document.getElementById("msg").value = '';
}
</script>
</html>
那么我们应该如何通过Websocket来实现单聊呢?
我们在通过每一次用户进来这个链接的时候,记录下来他注册的名字,然后将他的wsgi.websocket以:
user_socket_dict = {"nickname":"wsgi.websocket"}
这种字典的方式记录下来,然后将实现发送的需求。
下面是实现的代码:
"""
@author: Yxinmiracle
@project: f
@file: s1.py
@time: 2020/3/9 12:30
@desc:
/*code is far away from bug with the animal protecting
"""
from flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket # 语法提示用的
import json
app = Flask(__name__)
# wsgi.websocket socke-> socket链接 可以用来收发消息
# 拿到socket链接就可以进行通讯了
user_socket_dict = {}
@app.route("/ws/<username>")
def ws(username):
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket
user_socket_dict[username] = user_socket
print(len(user_socket_dict))
while 1:
try:
msg = user_socket.receive()
msg = json.loads(msg)
to_user = msg.get("to_user")
content = msg.get("msg")
usocket = user_socket_dict.get(to_user)
recv_msg = {"from_user": username, "msg": content}
usocket.send(json.dumps(recv_msg))
except:
pass
@app.route('/chat')
def chat():
return render_template("ws.html")
if __name__ == '__main__':
http_serv = WSGIServer(("0.0.0.0", 5000), 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="username"></p>
<p>请点击<button onclick="open_ws()">链接服务器</button></p>
<p>给:<input type="text" id="to_user"></p>
<p>发送消息:<input type="text" id="msg">
<button onclick="send_msg()">发送</button>
</p>
<div id="chat" style="width: 500px;height: 500px;">
</div>
</body>
<script type="text/javascript">
var ws = null;
function open_ws() {
var username = document.getElementById("username").value;
ws = new WebSocket("ws://192.168.0...../ws/" + username);
ws.onmessage = function (data) {
console.log(data.data);
var msg = JSON.parse(data.data);
var ptag = document.createElement("p");
ptag.innerText = "来自"+msg.from_user+ "的消息" + ":" + msg.msg;
document.getElementById("chat").appendChild(ptag);
};
}
function send_msg() {
var msg = document.getElementById("msg").value;
var to_user = document.getElementById("to_user").value;
var send_obj = {to_user:to_user,msg:msg};
ws.send(JSON.stringify(send_obj));
}
</script>
</html>
本期的Websocket基础版笔记就到此结束啦