我无法跟踪为什么我的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轮询
我想念什么吗?如果它们不兼容,这是否意味着我们现在必须根据通信层进行不同的编码?
答案 0 :(得分:1)
这是否意味着Socket.IO和WebSockets不兼容或 我做些愚蠢的事吗?我以为Socket.io应该是 能够处理不同的协议。
Socket.io在Websocket的顶部运行。就像您在问电话(websockets)和日语(socket.io)是否兼容。您无法回答,因为这是两个不同的通信层。因此,仅仅因为socket.io-client使用websockets与服务器通信并不意味着他可以与仅知道如何建立websocket连接(电话)的服务器交换消息,而无需说出socket.io协议(日语)。
您可能要使用的浏览器是本机WebSocket API,该浏览器已经提供了用于建立连接以及发送/接收消息的抽象。
当然,如果您的应用需要这样做,那么您将必须实施重新连接和重试策略以及后备传输。这就是socket.io提供的开箱即用功能。