React Socket.IO-Client与NodeJS(express)WebSockets不兼容吗?

时间:2018-07-09 17:27:18

标签: node.js reactjs websocket socket.io

我无法跟踪为什么我的React Client应用发出的消息没有到达本地主机套接字服务器。我正在使用经过修改的PuppyJS的分叉副本,以通过套接字接收客户端事件(https://github.com/BlackConure/puppyjs)。

我可以使用Apic Chrome浏览器扩展程序,并且可以通过Web套接字很好地连接到服务器端并向服务器端发送/接收消息,但是当我尝试通过React中的客户端应用程序进行连接时,连接似乎可以正常工作,但是发射什么也没做。

我已经在客户端启用了localstorage.DEBUG ='*',并且它不显示socket.io发生的任何事情。我还从--disable-web-security开始了chrome,以消除发生CORS问题的可能性;因此所有迹象表明问题出在我的客户端设置上。

这是配置:

为确保套接字没有尝试重新使用现有的(3006)连接,我还尝试了forceNew。仍然不起作用。

var socket = io.connect('ws://localhost:3000', {
        path: '/ws',
        transports: [ 'websocket' ],
        forceNew: true
    });

    console.log(socket);

    socket.on('connect', function() {
        alert('connect');
    });

    socket.on('event', function(data) {
        alert('event');
        console.log(data);
    });

    socket.on('disconnect', function() {
        alert('disconnect');
    });

    socket.on('error', function(data) {
        console.log(data || 'error');
    });

    socket.on('connect_failed', function(data) {
        console.log(data || 'connect_failed');
    });

    socket.emit('LOGIN', 'Testing 123');
    newstate.socket = socket;
    return newstate;

即使在服务器端,我也从客户端应用程序获得了连接,但似乎从未停止连接。

当我检查套接字对象时,io.readyState说打开;所以我认为服务器的响应一定有问题。我进行了RawCap&Wireshark转储,发现客户端收到了 HTTP 101交换协议响应(与Apic中相同);但此后什么也没发生。

我跟踪了发射,并且将LOGIN抛出到请求缓冲区中(因为connected = false),我认为这是因为它不处于readyState状态。

这没有任何意义,所以我使用Socket.IO作为服务器启动了一个简单的NodeJS服务器,并且一切正常!

这是否意味着Socket.IO和WebSockets不兼容,还是我做了一些愚蠢的事情?我以为Socket.io应该能够处理不同的协议。大卫·沃尔什(David Walsh)的文章(https://davidwalsh.name/websocket)指出:

  

Socket.IO简化了WebSocket API并统一了其API   后备运输。运输包括:

     
      
  • WebSocket
  •   
  • 闪存插槽
  •   
  • AJAX
  •   
  • 长轮询AJAX
  •   
  • 分段流
  •   
  • IFrame
  •   
  • JSONP轮询
  •   

我想念什么吗?如果它们不兼容,这是否意味着我们现在必须根据通信层进行不同的编码?

1 个答案:

答案 0 :(得分:1)

  

这是否意味着Socket.IO和WebSockets不兼容或   我做些愚蠢的事吗?我以为Socket.io应该是   能够处理不同的协议。

Socket.io在Websocket的顶部运行。就像您在问电话(websockets)和日语(socket.io)是否兼容。您无法回答,因为这是两个不同的通信层。因此,仅仅因为socket.io-client使用websockets与服务器通信并不意味着他可以与仅知道如何建立websocket连接(电话)的服务器交换消息,而无需说出socket.io协议(日语)。

您可能要使用的浏览器是本机WebSocket API,该浏览器已经提供了用于建立连接以及发送/接收消息的抽象。

当然,如果您的应用需要这样做,那么您将必须实施重新连接和重试策略以及后备传输。这就是socket.io提供的开箱即用功能。