Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接后不久发出的Socket.IO消息通常不会被Android客户端接收_Android_Reactjs_Socket.io - Fatal编程技术网

连接后不久发出的Socket.IO消息通常不会被Android客户端接收

连接后不久发出的Socket.IO消息通常不会被Android客户端接收,android,reactjs,socket.io,Android,Reactjs,Socket.io,我正在做一个websocket游戏。一般流程如下所示: 客户端创建到服务器的socket.IO连接 客户端发出请求加入游戏的消息 服务器将客户端添加到游戏中,并立即发送一些表示游戏当前状态的消息 在第三步中,桌面上的一切都很好,但当我在Android上运行Chrome中的代码时,第三步中服务器的事件通常不会被接收(但有时会)。随后将收到事件 在服务器上,如果我在收到加入游戏的请求(第2步)和发出游戏的当前状态(第3步)之间加上两秒钟的延迟,那么它在Android上也会持续工作 在客户端上,将创建

我正在做一个websocket游戏。一般流程如下所示:

  • 客户端创建到服务器的socket.IO连接
  • 客户端发出请求加入游戏的消息
  • 服务器将客户端添加到游戏中,并立即发送一些表示游戏当前状态的消息
  • 在第三步中,桌面上的一切都很好,但当我在Android上运行Chrome中的代码时,第三步中服务器的事件通常不会被接收(但有时会)。随后将收到事件

    在服务器上,如果我在收到加入游戏的请求(第2步)和发出游戏的当前状态(第3步)之间加上两秒钟的延迟,那么它在Android上也会持续工作

    在客户端上,将创建套接字连接,并在componentDidMount中订阅事件,如下所示:

    componentDidMount() {
      this.socket = socketIO(getKanjiGameServer());
    
      const { location } = this.props;
      const query = queryString.parse(location.search);
    
      if (!query.username) {
        window.$('#chooseUsernameModal').modal();
        return;
      }
    
      this.socket.on(socketEvents.Server.NO_SUCH_GAME, () => {
        window.$('#noSuchGameModal').modal();
      });
    
      /*
       * A bunch of other events get subscribed here
       */
    
      this.socket.emit(socketEvents.Client.JOIN_GAME, query);
    }
    
    我是不是在错误的地方打开了连接?根据我的测试,我确信服务器正在发送消息,但客户端中的处理程序没有执行

    我有一个在线测试服务器,完整的相关客户端代码是,服务器代码是。(我在服务器代码中添加了一个延迟,所以这个问题可能不会在测试服务器上发生……假设这个神奇的数字对您来说足够长)

    服务器发出前的断点会被命中,但客户端事件处理程序中的断点不会因为加入游戏后立即发送的事件而被命中

    编辑:根据评论,我将发出JOIN_游戏消息的代码更改为:

    console.warn('test');
    
    this.socket.on('error', err => {
      console.warn(err);
    });
    
    this.socket.on('connect_error', err => {
      console.warn(err);
    });
    
    this.socket.on('reconnect_error', err => {
      console.warn(err);
    });
    
    this.socket.on('connect', () => {
      this.socket.emit(socketEvents.Client.JOIN_GAME, query);
    });
    

    在远程调试中,“测试”警告会打印到控制台,但不会打印错误。我还尝试在“connect”事件之外发出事件,就像我以前做的那样,但也没有以这种方式打印错误。与以前一样,这在桌面上的Chrome中始终有效,但在Android上的Chrome中有时也有效,除非我在响应JOIN_游戏消息之前在服务器中添加延迟。

    您已确定modals没有打开,但您确定事件处理程序实际上没有执行吗?顺便说一句,你可以在你的设备上使用Chrome在你的开发盒上调试Chrome:-这非常有用。这不仅仅是模式,还有10-15个事件(由于长度原因省略),当新用户加入时,服务器会发出最近50个事件的历史记录。在这种情况下,它们都不会触发,我可以通过在其中放置window.alert()和断点来判断。chrome中的远程调试显示没有错误,断点也没有命中。为了更好地理解问题,我会做几件事:1)实现
    socket.on('error',…)
    ,并将结果转储到alert()或其他地方。2.)在('connect',…)上实现
    socket.on
    ,并从那里发出
    JOIN\u GAME
    。我怀疑在
    socketIO()
    返回后,无法保证立即连接套接字。可能还想实现套接字。on('disconnect',…)——你永远不知道你的连接什么时候会坏。@greeble31谢谢你的建议,当我读到你的评论时,我真的很有希望,但我仍然没有任何运气。我根据你的评论更新了我的问题,描述了我所做的事情。如果你没有其他想法,我想我会暂时忍受那里的耽搁,稍后可能会尝试在socket.io中进行调试,看看是否能弄清楚发生了什么。我正要在socket.io:)中建议一些断点位置,但我还要指出,通过查看“网络调试”窗格,您可以读取socket.io发送的所有内容。数据通常在POST中发出,然后通过对GET的响应返回。作为一种验证Chrome在XHR上是否取得良好效果的方法。