0

我有一个应用程序,其中用户的个人资料带有软木板。

当用户在其他用户个人资料上写东西时,该个人资料页面上的每个人都应该收到发射。


在客户端,我像这样连接到套接字服务器:

window.onload = function() {
    var socket = io.connect("https://10.94.30.134:8080");
    // ...
};

请注意,client.js 会在每次访问我的 profile.html 时加载并连接。我无法想象这是一个好方法。


然后在服务器端,我rooms用来确定用户当前位于哪个配置文件页面。

sio.on("connection", function(socket){
    socket.join(socket.handshake.session.last_visited_profile);
    // ...
    socket.on("send-corkboard-message", function(data) { // ...
    socket.on("send-chat-message", function(data) { // ...  
});

目前的方法有效,但我认为还有很多需要改进的地方。我在使用移动设备测试此设置时也遇到了问题。他们需要大约 5-10 秒来连接到套接字服务器。(这就是为什么我认为将套接字连接存储在客户端全局的某个地方会更好。)如果是这样,我没有机会让套接字在连接时加入房间,我宁愿在我的路由或客户端中这样做有订阅事件之类的东西吗?

"send-corkboard-message", "send-chat-message"事件中包含所有 socket.io 事件( )是一个好方法吗?connection

也许您可以帮助或将我链接到一些可以改善我当前情况的 socket.io 架构。提前致谢!

4

1 回答 1

0

您不能在客户端存储套接字连接。服务器负责维护连接,还处理心跳和房间。至于您的第二个问题,事件是否应该在处理程序中无关紧要而是connection必须将它们放在该处理程序中。

例如,如果我们有一个处理程序:

io.sockets.on('connection', function(socket) {
  socket.emit('event', data);
});

socket对象是在处理程序中在线定义的。因此,您不能在它之外附加事件。

至于您的架构,您应该避免将数据发送给不需要数据的客户端。因此,如果您有一组需要或不需要某些数据的客户端,您可以创建房间,并让客户端在连接时订阅某个房间:

io.sockets.on('connection', function(socket) {
  socket.on('subscribe', function(room) {
    socket.join(room);
  });
  socket.on('unsubscribe', function(room) {
    socket.leave(room);
  });
});

然后在客户端:

var socket = io.connect('/');
socket.emit('subscribe', 'room1');

另请注意,您无需等待 DOM 加载即可创建 Socket.IO 连接。所以你不需要window.onload = function() {};,这可能会加快连接的建立。

于 2013-10-22T14:49:51.080 回答