2017-02-17 117 views
-1

在文档页面上,他们说我需要这样使用。将客户端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

这样我可以在我的其他功能中使用套接字。

现在对我的东西冒落的每个函数我做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发射

<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> 

回答

0

在您需要处理多个插槽,一个为每个客户端服务器。这就是为什么在服务器上,你编写了一个事件处理程序,为每个连接的新客户机设置套接字。其基本思路是这样的:

服务器:

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

你的所有消息处理应该是在外部功能设置。通过调用socket.emit()

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

attemptLogin(socket, user, hash)功能现在可以处理的参数,然后回复到客户端。如果您想:如果你想在其他地方却使用socket,你可以通过它在这样将每个用户的套接字存储在一个变量中,您需要创建一个数据结构来执行此操作。这里有一个例子:

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

这是但如果连接的用户可以在断开连接后不知何故恢复他们以前的会话时才有用。否则,这只是正确组织你的函数和变量的问题。

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

+0

它有助于澄清一些事情,但我不在乎用户,我不需要发送和发送事件的“用户”,不在乎是否为2或一千。 几乎没有什么会在服务器上进行处理,仅在客户端上执行。 这就是为什么我想从file1发出并从file2作出反应。 –

+0

那你为什么要用socket.io呢?如果你想在file1上存储信息并将它读回到file2上,只需使用'localStorage'。 –

+0

我没有说'商店',我说发送事件,电脑1打开文件1(管理页面)发送事件,电脑2文件2(前端)反应事件,反之亦然@ chris-g(第三个电脑将是服务器) –