我一直在研究Nodejs和Socket.io,问题是我在如何获取url参数(www.example.com/sample/:sampleid)并在我的套接字上使用它时遇到了困难连接。
以下是一个例子:
var roomname;
var username;
app.get('/room/:roomname/user/:username', function(req, res){
var room = {
username: req.params.username,
roomname: req.params.roomname
};
roomname = room.roomname;
username = room.username;
res.render('room', room);
});
var users = {};
io.sockets.on('connection', function (socket) {
socket.username = username;
socket.room = roomname;
users[username] = username;
console.log("joining room: " + roomname)
socket.join(roomname);
console.log("emiting to room: " + roomname)
socket.broadcast.to(roomname).emit('newUser', username);
});
我只是将名称存储在房间名称并在io.sockets.on
内使用,但我认为这是一个黑客攻击,应该是实现这一目标的更好方法......
解决这种情况的好方法是什么?
答案 0 :(得分:1)
套接字可以发出任何事件,因为套接字对象是EventEmitter
,因此它可以随时触发(发出)事件,而另一方服务器可以通过.on函数监听此事件
example
socket.emit('join',{name:"ahmed"})
server
io.sockets.on('join',function(data){
console.log(data.name)
})
答案 1 :(得分:1)
由于您正在使用res.render
,并且您已经将room
作为数据参数传递,我认为最好使用它并执行类似的操作(我在示例中使用EJS)因为我已经习惯了):
客户端:
<script>socket.emit('join', {room: '<%- room.roomname %>' });</script>
服务器:
io.on('connection', (socket) => {
socket.room = '';
socket.on('join', (msg) => {
socket.room = msg.room;
});
});
否则发出document.location.pathname
可能是一个想法,但是你必须自己解析路径以获取房间名称。
编辑:
由于以下情况,您目前正在做的事实际上非常危险:
用户1打开页面,“全局”变量username
和room
设置(我们现在将它们设置为foo
),但用户1的互联网速度较慢,因此需要一些时间加载和socket.io连接。
现在用户2打开页面,在用户1打开套接字之前,“全局”变量username
和room
被更改为新值(让我们使用bar
)。 io连接。
现在,用户1和用户2与socket.io连接,但由于用户2的互联网速度比用户1快,var username
和var roomname
现在都设置为值bar
,即使用户1有username
和roomname
foo
。
只是抬头。
答案 2 :(得分:0)
我有同样的问题,并得出了不同的解决方案,我在连接时传递了参数。
dataList::get
因此,在服务器端,我们可以像下面这样获取参数
dataList = new ArrayList<>(dataList)
好处是,当连接丢失时,您不必依赖客户端将再次调用自定义连接事件的事实,您可以将逻辑放入默认的//it's my connection in client side
let socket = socketio(`http://localhost:4444?user=${uuid}&room=${room}`);
// where UUID is my user ID and room id