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

min*_*ddy 1 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"
Run Code Online (Sandbox Code Playgroud)

在组件中:

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

     });
    }
Run Code Online (Sandbox Code Playgroud)

在服务器中:

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

在 userAgent.js 中

window.navigator.userAgent = 'react-native';
Run Code Online (Sandbox Code Playgroud)

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

function load() {
 var r;
 try {
  r = exports.storage.debug;
 } catch(e) {}
 return r;
}
Run Code Online (Sandbox Code Playgroud)

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

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

反应原生版本:0.27.2

socket.io-client 版本:1.4.8

有谁知道哪里出了问题?

min*_*ddy 7

好吧,最后我在查看 socket.io 源代码后找到了解决方案。似乎 socket.io 默认不使用“websocket”作为传输。在我的情况下它将使用“轮询”,因此只需明确设置它:

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

现在它起作用了。但仍然让我感到困惑的是,在浏览器客户端中,我没有设置传输,它运行良好,但在 react-native 中却没有。不明白为什么。