【问题标题】:Socket.io client responds only onceSocket.io 客户端只响应一次
【发布时间】:2019-04-04 15:44:32
【问题描述】:

我正在创建一个快速服务器,它将导致 index.html 页面在接收到发布请求时重定向到新页面。一切正常,但只是第一次。我必须定期重新启动服务器才能正常工作。这里有一些代码sn-ps。

//server.js

const app = express();
app.use(express.static(`${__dirname}/public`));

const server = http.createServer(app);
const io = socketIo(server, {'force new connection': true });

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

    app.post('/redirect', (req,res) => {
        socket.emit('redirect');
        res.status(200).send('Redirected');
    });
});
<body>

   <!-- Jquery CDN -->
   <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
   <!-- Socket.IO -->
   <script src="/socket.io/socket.io.js"></script>

   <script>
   let socket = io.connect({'force new   connection': true });
   socket.on('connect', () => {
       console.log('Connected to Server');
   });

   socket.on('redirect', () => {
       window.location.replace("https://google.com");
   });
   </script>

</body>

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    主要问题是您的路由位于套接字连接侦听器中。一条路线应该只注册一次。并且connection被多次触发。

    const app = express();
    app.use(express.static(`${__dirname}/public`));
    
    const server = http.createServer(app);
    const io = socketIo(server, {'force new connection': true });
    
    app.post('/redirect', (req,res) => {
        res.status(200).send('Redirected');
        io.emit('redirect');
        // io.to(someSocketOrRoom).emit('redirect');
    
    });
    
    io.on('connection', (socket) => {
        console.log('New client connected');     
    });
    

    如果您想在收到来自套接字外部的消息时向套接字发出,在这种情况下是 HTTP Post。您需要使用io.emit 向所有套接字发射,或使用io.to().emit 向特定套接字发射。

    现在,使用 socket.io 重定向没有多大意义,如果您要发布到 /redirect,为什么不直接使用 res.redirect 重定向用户,而不发送任何内容。

    【讨论】:

    • 是的,我知道使用 socket.io 重定向没有多大意义。但是我是 socket.io 的新手,这对我来说就像一个“Hello World”练习程序。我正在尝试您的解决方案,但我有一个疑问。网上有人告诉我,你必须只使用io来建立连接,然后你必须使用socket进行一对一的双向通信。那么这个逻辑对吗?
    • io.emit 使用相同的socket 来发出数据,它只是遍历所有套接字。所以这是一个双向通信。你可以访问一个特定的套接字,我在代码中评论了那部分:io.to..
    • 我稍微更新了我的答案,来解释一下io.emit
    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 2020-08-19
    • 2021-01-05
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2017-08-07
    相关资源
    最近更新 更多