我遇到问题,无法使我的socket.io客户端从服务器正确接收带有自定义事件类型的消息。
当客户端成功连接后,我发出从服务器获取客户端用户ID的请求。在尝试在HTTP请求和WebSocket之间使用会话时遇到麻烦之后,我切换到通过jinja模板传递用户ID。
但是,现在我很难让客户端从服务器接收自定义类型的数据包。
controller.py
@socketio.on('connect')
def connect():
hello = 'Hello'
emit('get_user', hello, include_self=True)
socketio.sleep(0)
return
index.html *
<script>
const socket = io(SERVER_URL/PATH);
socket.on("get_user", function (data) {
console.log(data);
socket.emit("send_user", {{ user.id }});
</script>
服务器显示它正在“发出”具有正确类型的消息,但随后在将其作为消息发送之后。
然后,客户端仅接收到类型为"message"
而不是类型为"get_user"
的已发送消息>
问题是:如何使发射器正常工作?
任何帮助将不胜感激。谢谢!
编辑:发布其余代码。
controllers.py
# Import flask dependencies from flask import Blueprint, request, render_template, flash, g, session, redirect, url_for from flask_socketio import send, emit # Import the database class for the app from app import db, socketio # Import module models from app.mod_auth.models import User, Socket from app.mod_home.models import Topic # Define blueprint for home and set the url prefix mod_home = Blueprint("home", __name__, url_prefix='/home') @mod_home.route('/', methods=['GET']) def home(): print('-----route------\n%r\n-------------------' % session['user_id']) # check if user is logged in if (not 'user_id' in session) or (session['user_id'] == None): return redirect(url_for('auth.signin')) user_id = session['user_id'] # Use the user id to retreive the user's friends list user = User.query.get(user_id) friends = user.friends.all() # Use the user id to retreive the chats that they belong to # Retreive a list of the top topics show first 10 return render_template("home/homepage.html", user=user, friends=friends) @socketio.on('connect') def connect(): # Reply back to client that connection was successful hello = 'Hello' emit('get_user', hello, include_self=True) socketio.sleep(0) return @socketio.on('send_user') def register_user(user): print(user) # user_id = session['user_id'] # socket_id = request.sid # # # Create socket entry # socket = Socket(user_id, socket_id) # # # Add and Commit socket entry # db.session.add(socket) # db.session.commit()
homepage.html
<head>
<title>Home Page</title>
<link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
...
<script type="text/javascript" charset="utf-8">
$(function () {
const socket = io('http://127.0.0.1:5000/home');
socket.on("get_user", function (data) {
console.log("received connection_succeeded");
console.log(data);
socket.emit("send_user", {{ user.id }});
});
});
</script>
</body>
我在使我的socket.io客户端从服务器正确接收带有自定义事件类型的消息时遇到了问题。当[...