将客户端socket.io返回给变量

时间:2017-02-17 17:58:11

标签: javascript node.js socket.io

在文档页面上,他们说我需要像这样使用。

io.on('connection', function (socket) {
    socket.emit('news', { hello: 'world' });
    socket.on('my other event', function (data) {
        console.log(data);
    });
});

有什么方法可以将客户端公开给变量吗?

var socket = io.on('connection');
socket.emit('news', { hello: 'world' });

在帮助页面上,他们说Server#onconnection(socket:engine#Socket):Server公开客户端,但我无法弄清楚如何使用它。 doc

这样我就可以在其他函数中使用socket。

现在,在我发出内容的每个功能上,我都会重新进行io.on('connection', function (socket)

另一个问题:

有一种方法可以让不同的文件相互发出事件

app.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

file1.html emit

<script src="socket.io/socket.io.js"></script>
<script>
    var socket = io('http://localhost');

    socket.emit('event15', function(x){
    });

</script>

file2.html接收

<script src="socket.io/socket.io.js"></script>
<script>
    var socket = io('http://localhost');

    socket.on('event15', function(x){
    });

</script>

1 个答案:

答案 0 :(得分:0)

在服务器上,您必须处理多个套接字,每个客户端一个套接字。这就是为什么在服务器上编写一个事件处理程序,为每个连接的新客户端设置套接​​字。基本思路是:

服务器

io.on('connection', function(socket) {
  socket.on('chat message', function(msg) {
    io.emit('chat message', msg);
  });
});

应该在外部函数中设置所有消息处理。但是,如果你想在其他地方使用套接字,你可以像这样传递它:

io.on('connection', function(socket) {
  socket.on('login', function(data) {
    myServer.attemptLogin(socket, data.user, data.hash);
  });
});

attemptLogin(socket, user, hash)函数现在可以处理参数,然后通过调用socket.emit()来回复客户端

如果要将每个用户的套接字存储在变量中,则需要创建一个数据结构来执行此操作。这是一个例子:

var users = {}; // empty object
io.on('connection', function(socket) {
  users[socket.id] = socket; // store socket for later use
  // ...
});

这仅在连接用户可以在断开连接后以某种方式恢复其先前会话时才有用。否则,这只是正确组织函数和变量的问题。

至于第二个问题,您无法将数据从一个HTML文档发送到另一个HTML文档。一旦用户单击指向file2.html的链接,就会打开一个新的套接字,socket.io甚至不会意识到这仍然是同一个用户。就socket.io而言,一些随机的家伙刚刚在世界其他地方开了file2.html 有两种方法:您可以创建单页应用程序,用户实际上从未实际导航到另一个站点。但是,如果他们意外关闭标签,导航或刷新页面,他们仍会丢失连接 另一种方法是使用某种会话信息。如果用户登录,您只需将他们的用户名和密码哈希存储在localStorage中。在每个页面上,检查localStorage以获取存储的凭据,然后向服务器发送"login"消息。