为什么Socket.io不在真实的实时服务器中发出?

时间:2019-06-12 10:01:39

标签: node.js react-native socket.io

我有一个简单的聊天应用程序,带有react-native,nodejs,socket.io和express。

此应用在我的笔记本电脑上运行良好,因为我正在将本地nodejs服务器与epxress一起使用

现在我正在从hostwinds使用真实的实时服务器在这里,我已经设置了nodejs + express服务器。这里的连接工作良好,但问题是它不会从客户端或服务器发出,我的意思是第一次它成功连接到服务器,但没有发出事件或发送数据。

我的客户代码是:

import io from 'socket.io-client';

class InitSocket extends Component{
  constructor(props){
        super(props);
        this.socket = io('http://LiveServerIP:3000/', { transports: ['websocket'] });
        this.socket.emit('onsenddata', 'Hello from client to server');
  }
}

以上代码发出('onsenddata','一些数据');只能工作几次,但大部分时间都行不通。在上面的代码中,您可以看到我正在使用hostwinds实时服务器的IP地址。

以下代码效果很好,虽然与上面的代码相同,但是它在我的笔记本电脑中,并且IP地址是localhost:

import io from 'socket.io-client';

class InitSocket extends Component{
  constructor(props){
        super(props);
        this.socket = io('http://localhost:3000/', { transports: ['websocket'] });
        this.socket.emit('onsenddata', 'Hello from client to server');
  }
}

我的服务器代码是:

const app = require('express')();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const port = 3000;
io.on('connection', cs => {

  cs.on('onsenddata', username => {
       cs.broadcast.to(cs.id).emit('onsenddata', 'Hello from server to client');
  });

});

server.listen(port, err => {
    if(err){
        console.error("Some Error: "+err);
    }else{
        console.log(`Server is running on port: ${port}`);
    }
});

3 个答案:

答案 0 :(得分:1)

此代码在heroku上对我有效:

客户端:

const socket = socketIO('https://myserver.onheroku.com', {
  transports: ['websocket'], 
  jsonp: false 
}); 
socket.connect(); 
socket.on('connect', () => { 
  console.log('connected to socket server'); 
});
socket.emit('onsenddata', 'Hello from client to server');

服务器:

const http = require('http');
const express = require('express');
const socketIO = require('socket.io');

const app = express();
const server = http.createServer(app);

const io = socketIO(server);
io.on('connection', socket => {
  console.log('client connected on websocket');
});

server.listen(PORT, () => {
  console.log('server started and listening on port ' + PORT);
});

server.listen(port, err => {
    if(err){
        console.error("Some Error: "+err);
    }else{
        console.log(`Server is running on port: ${port}`);
    }
});

答案 1 :(得分:1)

Heroku将不会使用端口3000,请在部署应用之前尝试使用由Heroku设置的 process.env.PORT

服务器代码:

const port = process.env.PORT || 3000;

客户端代码(HEROKU_APP_URL是已部署的Heroku App的URL)

this.socket = io(HEROKU_APP_URL, { transports: ['websocket'] });

答案 2 :(得分:0)

使用settimeout函数解决了我的问题

componentDidMount(){
   setTimeout(()=>{
     this.socket.on('onreceiveddata', message =>{
        console.log(message);
     });
   }, 2000);
}