我有一个简单的聊天应用程序,带有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}`);
}
});
答案 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);
}