【问题标题】:socket.io multiplexing connection by refreshing client pagesocket.io 通过刷新客户端页面复用连接
【发布时间】:2017-06-19 02:49:00
【问题描述】:

我的 socket.io 有问题

当我刷新客户端页面时,套接字会增加。

例如,这是示例代码

var express = require("express"),
    http = require('http'),
    app = express(),
    server = http.createServer(app),
    io = require('socket.io').listen(server);

app.get("/",(req,res)=>{
    var doc=`
    <html>
        <head>
            <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
            <script>
                var socket = io();
            </script>
        </head>
        <body>
            <h1>hello!</h1>
        </body>
    </html>
    `
    res.send(doc);
    io.on("connection",function(socket){
        console.log("connected!")
    })
})

在第一次连接时,服务器日志有 1 个“已连接!”消息。

刷新客户端页面后,console.log() 触发了两次。所以日志有 3 个“已连接!”消息

再刷新一次会触发三次 -> 6 条连接消息

还有下一个四重奏!

我不知道为什么连接是多路复用的。你能帮帮我吗?

【问题讨论】:

    标签: node.js sockets


    【解决方案1】:

    您声明的服务器端套接字的事件处理程序只需注册一次。

    var express = require("express"),
    http = require('http'),
    app = express(),
    server = http.createServer(app),
    io = require('socket.io').listen(server);
    
    io.on("connection",function(socket){
        console.log("connected!")
    })
    
    app.get("/",(req,res)=>{
    var doc=`
    <html>
        <head>
            <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
            <script>
                var socket = io();
            </script>
        </head>
        <body>
            <h1>hello!</h1>
        </body>
    </html>
    `
    res.send(doc);
    })
    

    每次从浏览器发出请求时,您都在向任何打开的套接字添加一个新的匿名函数作为事件侦听器。

    【讨论】:

    • 非常感谢!如果我需要访问套接字中的参数“req”怎么办?
    • "connection" 事件为您提供了一个引用(在回调中)到一个连接了浏览器实例的活动套接字。您需要将引用存储在您的服务器上 - 以适当的数据结构(带有键或数组的对象等) - 这样您就可以在其他服务器功能(例如您的请求处理程序)中使用它。请记住,请求事件和套接字中的事件之间没有隐含的关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2014-05-01
    • 1970-01-01
    • 2018-02-15
    • 2017-06-14
    相关资源
    最近更新 更多