【问题标题】:Socket.io Server Emit only works after server restartSocket.io Server Emit 仅在服务器重启后有效
【发布时间】:2020-08-11 09:53:20
【问题描述】:

如果这是一个非常愚蠢的问题,请原谅我。
我正在观看有关 Socket.io 的教程,一切都很好。所以我想在 reactjs 应用程序中尝试一下。 但问题是,虽然我能够从客户端发射,但我无法从服务器端发射。
如果我重新启动服务器,发射就可以工作 strong> 我的意思是,当我运行应用程序时,最初服务器会记录消息,重新启动后,客户端会记录消息。

客户端

import React, { Component } from 'react';
import socket from '../socketConfig'

class App extends Component {
    componentDidMount(){
        socket.on('hello',(data)=>{
            console.log(data);
        })
        socket.emit('call','this is from client');
    }
    render(){
        return (
            <div></div>
        )
    }
}
export default App;

socketConfig

import openSocket from 'socket.io-client';

const socket = openSocket("http://localhost:4000/");

export default socket;

服务器端

var express = require('express');

var socket = require('socket.io');
var app = express();
var server = app.listen(4000, function () {
  console.log('listening for requests on port 4000,');
});

app.use(express.static('public'));

var io = socket(server);

io.sockets.on('connection', (socket) => {
  socket.emit('hello','msg from server');
  socket.on('call', (data)=>{console.log(data)});
}

【问题讨论】:

  • 服务器发送的问题码到底在哪里?你是说socket.emit('hello','msg from server'); 只在第一次工作并且在随后的新连接上不起作用?或者是否有其他一些服务器代码试图发出但不起作用?
  • 服务器端的控制台由于 socket.emit('call','this is from client) 记录了消息“这是来自客户端”,但浏览器控制台上没有我期待的消息socket.emit('hello','来自服务器的消息'); .但是当我重新启动服务器时,我在浏览器控制台上收到了消息。
  • 我对 React 了解不多,但我想知道您是否没有在连接后尽快安装 hello 消息的侦听器,所以客户端可能会错过第一条消息。当您重新启动服务器时,socket.io 客户端会看到它丢失了连接并重新建立它。到那时,监听器就到位了。
  • 这对我来说有点道理。但我不知道如何检查。
  • 您可以通过延迟服务器发送来测试理论:setTimeout(() =&gt; {socket.emit('hello','msg from server');}, 2000);。如果这使消息显示出来,那么您将必须更好地协调客户端上连接和安装侦听器之间的时间。

标签: javascript node.js reactjs sockets socket.io


【解决方案1】:

我认为问题可能出在您使用的网址中 - socket.io 可能很挑剔,因为它不是严格意义上的网络套接字,它是长轮询和网络套接字的包装器。因此,您可能必须指定要使用的传输方式,因为套接字处理是在与 http 处理相同的端口上完成的。

从客户端试试这个网址:

ws://localhost:4000/socket.io/?EIO=3&amp;transport=websocket

【讨论】:

  • 感谢您的回答。但现在我认为问题出在客户端代码本身。但是我仍然不明白为什么重启服务器会以我提到的方式运行。
【解决方案2】:

所以问题是我正在监听 compponentDidMount() 中的事件,但使用 componentDidUpdate() 解决了这个问题。

应用组件

    state = {
        socket:null
    }
    componentDidMount(){
        this.setState({
            socket:io("http://localhost')
        })  

    }
    componentDidUpdate(){
        let sokt = this.state.socket;
        sokt.on('connect',()=>{
            sokt.on('hello',(data)=>console.log(data)); //logged: msg from server
            sokt.emit('call',"This is from client"); //logged: This is from client
        })
    }

但我不确定这是否是正确的方法

【讨论】:

  • 我也面临同样的问题,但您的解决方案对我不起作用。有什么想法吗 ??另外,我正在使用功能组件。但是用类组件也实现了同样的功能,没有用。
猜你喜欢
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
相关资源
最近更新 更多