【发布时间】: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(() => {socket.emit('hello','msg from server');}, 2000);。如果这使消息显示出来,那么您将必须更好地协调客户端上连接和安装侦听器之间的时间。
标签: javascript node.js reactjs sockets socket.io