socket.io-client在react-native中使用时保持连接

时间:2016-06-25 12:01:45

标签: websocket socket.io react-native

我想在我的RN项目中使用websocket。我使用服务器端的ws和RN内置的websocket实现来完成它。 但是因为我以前使用socket.io似乎不那么方便。 所以我试着使用socket.io: 在RN:

import './userAgent'
import io from "socket.io-client/socket.io"

在组件中:

    componentDidMount() {
     this.socket = io('https://localhost:4080',{jsonp: false});
     this.socket.on('hello', (msg) =>{
       this.setState({response:msg})

     });
    }

在服务器中:

  io.on('connection', function(socket){
   socket.emit('hello','hello world')
   console.log('a user connected');
   socket.on('disconnect',function(){
     console.log('user disconnected')
   })
  })

在userAgent.js

window.navigator.userAgent = 'react-native';

这就是我用谷歌搜索的结果,他们说它会起作用。但对我来说,chrome调试器停在:

function load() {
 var r;
 try {
  r = exports.storage.debug;
 } catch(e) {}
 return r;
}

它说存储没有定义。 然后我查看了socket.io.js并发现exports.storage是window.localStorage。所以我禁用了远程js调试,代码开始运行。

但是服务器继续记录:用户已连接。好像我的RN应用程序一直在连接到服务器。似乎socket.on()在客户端不起作用。

react-native version:0.27.2

socket.io-client version:1.4.8

任何人都知道哪里出错了?

1 个答案:

答案 0 :(得分:3)

好吧,最后我通过socket.io源查找了解决方案。 似乎socket.io默认不使用'websocket'作为传输。它会在我的情况下使用'轮询',所以只需要明确地设置它:

 componentDidMount() {
    var socket = io('http://localhost:4080', { jsonp: false, transports: ['websocket'] })
    socket.on('hello', (msg) => {
       //do something
    });
}

现在它有效。 但令我困惑的是,在更广泛的客户端我没有设置传输,它只是运行良好,但在反应本机它不。没弄明白为什么。