我是在做视频通话(通知对方的时候遇到的问题),于是写了个小的demo来测试,结果也是走不通。
这是我demo的逻辑:通过在内存或者redis中保存登录之后,前端发送的store sid 事件,将用户的sid保存下来,方便后面去指定发送给某个用户,但是对方客户端接收不到我响应的socketio事件,后端也不报错,请问我是哪里做错了
前端代码(登录成功之后,发送store sid事件,保存用户的sid)
<script type="text/javascript">
var socket = io('http://192.168.1.24:2323');
$('#login').click(function () {
$.ajax({
url: '/login',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
account: $('#account').val(),
password: $('#password').val()
}),
success: function (data) {
if (data.code === 200) {
socket.emit('store sid', {'uid': data.uid});
window.location = '/home'
}
},
error: function (data) {
console.log(data.code)
}
})
})
</script>
前端代码(发送消息)
<html>
<title>chatting page</title>
<body>
<input type="hidden" value="{{ uid }}" id="uid">
<input type="hidden" value="{{ cid }}" id="cid">
Message: <input type="text" id="msg">
<button id="send">Send</button>
</body>
<script type="text/javascript" src="{{ url_for('static', filename='js/jquery-3.5.1.min.js') }}"></script>
<script type="text/javascript" src="{{ url_for('static', filename='js/socket.io.js') }}"></script>
<script type="text/javascript">
var socket = io('http://192.168.1.24:2323');
$('#send').click(function () {
socket.emit('new message', {
'msg': $('#msg').val(),
'uid': $('#uid').val(), // html代码中隐藏
'cid': $('#cid').val() // html代码中隐藏
})
});
socket.on('new message resp', function (data) {
console.log(data)
})
</script>
</html>
后端socketio事件(namespace为默认的 / )
# 存储用户的sid
all_sid = {}
@socketio.on('store sid')
def store_sid(data):
# uid is user_id
all_sid[data['uid']] = request.sid
@socketio.on('new message')
def new_message(data):
# uid is user_id
to_user_id = data['uid']
emit('message response', {'message': 'this is new message.'}, room=all_sid[to_user_id])
版本:
python 3.7.8
flask-socketio 4.3.1
出现的效果是,后端发送的message response事件,前端接收不到数据,前端console不打印,后端也不报错,但是我如果换成广播(broadcast=True),就不报错