在(“message”)处理程序上定义Socket.io的最有效方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在(“message”)处理程序上定义Socket.io的最有效方法相关的知识,希望对你有一定的参考价值。

Socket.io示例都遵循这种模式

io.sockets.on("connection", function(mySocket){
    mySocket.on("my message", function(myData){
        ...
    });
});

在我看来,这将为每个连接创建一个新的回调函数。假设每个套接字以相同的方式响应消息,那么为所有套接字定义一次处理程序就不会有更高的内存效率,如下所示:

function myMessageHandler(data){
    ...
}

io.sockets.on("connection", function(mySocket){
    mySocket.on("my message", myMessageHandler);
});

甚至这个:

io.sockets.on("my message", function(mySocket, myData){
    ...
});

如果是这样,为什么Socket.io会推荐一种浪费内存的做法?我们是否希望在“连接”回调的闭包内保留套接字的有状态变量?

答案

从另一个角度来看,第一种形式很容易阅读(因为遗漏了很多细节)。我认为这种形式最能说明图书馆的运作方式。我相信,Node网站本身使用了类似的风格,原因相同。我认为这正是它们在那些地方使用的原因。

几分钟后阅读博客和讨论表明,开发人员通常选择传递命名函数。虽然我确信它有性能提升,但主要动机无疑是可读性。我认为随着你的职能的增长,你会发现第二种形式(或更抽象的形式)更易于使用。

另一答案

以最有效的方式定义Socket.io:

   io.on('connection', function (socket) {
   socket.on('new-message', function (data) {
       io.emit('emit-message', data)
        });
   });

要么

   io.on('connection', (socket) => {
   console.log('user connected');

   socket.on('disconnect', () => {
       console.log('user disconnected');
        });
   });

以上是关于在(“message”)处理程序上定义Socket.io的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

socket.io - 如何访问未处理的消息?

socket 上传 -- 异常处理--UDP协议 --自定义socket #29

Socket.io - 分配套接字属性

golang中tcp socket粘包问题和处理

idhttp post 出现exception class EIdSocketError with message 'Socket Error # 10054的解决办法(捕捉异常,防止程序挂掉

C# Message 消息处理