我在尝试在 react-native 上建立网络套接字连接时遇到了麻烦。 我不确定是否支持此平台,但是,此错误可在常规 node.js 应用程序上重现。 奇怪的是,我只有在 react-native 的内置调试器被禁用时才会遇到麻烦。 我正在 IOS 10.2 上使用react-native v0.43.1
和socket.io-client v1.7.3
对此进行测试。 我的服务器运行socket.io v1.7.2
托管在 HTTP 端口 1337 上。
一旦我在 react-native 中实现socket.io-client
在没有启用调试器的XHR: POLLING ERROR
。 如果我在我的传输选项中指定 'websocket' 那么错误会变成WEBSOCKET ERROR
。 这就是我得到的。
到我的服务器的常规网络套接字连接。 它与启用的调试器一起工作。
我发现与这个问题相关的唯一另一个问题是#1056,我很惊讶这些问题的相关性有多奇怪。 我已经在常规 node.js 应用程序上重试了该场景,并且我遇到了类似的结果,但是错误更详细,如下所示。
没有指定的传输选项:
{ Error: xhr poll error
at XHR.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
at Request.<anonymous> (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:129:10)
at Request.Emitter.emit (/path/to/root/node_modules/component-emitter/index.js:133:20)
at Request.onError (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:307:8)
at Timeout._onTimeout (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:254:18)
at ontimeout (timers.js:365:14)
at tryOnTimeout (timers.js:237:5)
at Timer.listOnTimeout (timers.js:207:5) type: 'TransportError', description: 503 }
使用transports: ['websocket']
:
{ Error: websocket error
at WS.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
at WebSocket.ws.onerror (/path/to/root/node_modules/engine.io-client/lib/transports/websocket.js:149:10)
at WebSocket.onError (/path/to/root/node_modules/ws/lib/WebSocket.js:452:14)
at emitOne (events.js:96:13)
at WebSocket.emit (events.js:189:7)
at ClientRequest.onerror (/path/to/root/node_modules/ws/lib/WebSocket.js:711:10)
at emitOne (events.js:96:13)
at ClientRequest.emit (events.js:189:7)
at TLSSocket.socketErrorListener (_http_client.js:358:9)
at emitOne (events.js:96:13)
type: 'TransportError',
description:
{ Error: socket hang up
at TLSSocket.onHangUp (_tls_wrap.js:1117:19)
at Object.onceWrapper (events.js:291:19)
at emitNone (events.js:91:20)
at TLSSocket.emit (events.js:186:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
code: 'ECONNRESET',
type: 'error',
target:
WebSocket {
domain: null,
_events: [Object],
_eventsCount: 4,
_maxListeners: undefined,
_socket: null,
_ultron: null,
_closeReceived: false,
bytesReceived: 0,
readyState: 0,
supports: [Object],
extensions: {},
_binaryType: 'nodebuffer',
_isServer: false,
url: 'wss://SERVER_IP:1337/socket.io/?EIO=3&transport=websocket',
protocolVersion: 13 } } }
还要记住,socket.io 的基于浏览器的客户端可以完美地连接到这个特定的 Web 服务器。
我尝试过各种不同的网络、ISP 甚至 VPN。 我在这一点上一无所知。
更新:最终在我的 iPhone 上使用 socket.io-client 测试了我的一个应用程序后,我很幸运没有遇到 XHR 轮询错误。 但是,我仍然在常规节点应用程序上遇到此错误。
我目前的节点应用程序也遇到了同样的问题。 我使用 socket.io 的内置服务器,它似乎在浏览器中工作正常,但在节点应用程序中 socket.io-client 抛出相同的 503 xhr poll 错误。 我在同一台机器上运行服务器和客户端,但从客户端应用程序连接到环回或本地网络地址不起作用。 我正在使用socket.io
和socket.io-client
版本1.7.3
socket.io-client
。
从节点运行时,我还在版本2.0.1
(客户端和服务器)中看到此错误。
我一周前通过重构解决了我的问题,但我不记得究竟是什么解决了问题。 抱歉,我度过了忙碌的一周,这是最初的提交。
您可以尝试在客户端将opts.transports
为仅websocket
:
io.connect(url, { transports: ['websocket'] }); // default is ['polling', 'websocket']
在重构代码之前,我的套接字和动作绑定逻辑太复杂了。 因此,请确保代码中的套接字逻辑正常工作并使其更易于调试。
我会试试我们的交通工具。 现在我已经降级到 1.7.4 并且一切似乎都有效。
是的,我将版本从 2.0.1 降到 1.7.4 解决了这个问题
所以我已经升级回2.0.1
并且我将我的客户端设置为仅使用 websocket 传输。 它(几乎)有效:
io(`localhost:8080`, {
transports: [ 'websocket' ],
upgrade: false
});
现在我唯一的问题是 web 工作者范围的 websocket 传输被破坏。 我想我已经确定了问题并在engine.io-client
上打开了一个相应的问题https://github.com/socketio/engine.io-client/issues/569
是否有任何错误抛出? 您可以在启用调试的情况下运行吗? ( DEBUG=engine*
)
关于 react-native,可以链接到https://github.com/socketio/socket.io-client/issues/1114。
@darrachequesne所以我只是在我的服务器端客户端组件上恢复到默认传输。 我的错误......轮询传输绝对适合我。 我遇到的问题是我为本地开发人员签署的 ssl 证书。 我必须将rejectUnauthorized: process.env.NODE_ENV === 'production'
到 socket.io 配置中才能使其工作。 否则我会得到503
。
网络工作者问题是真实的。 socketio/engine.io-client#569
试试这个
require('socket.io-client')('http://localhost', {
rejectUnauthorized: false,
})
Thanks I'll try it
----- 原始邮件 -----
发件人:Zetsin [email protected]
收件人:"socketio/socket.io-client" [email protected]
抄送人:Wangzhiqiang [email protected], Comment [email protected]
主题:Re: [socketio/socket.io-client] XHR Polling Error appears when debugger is present (#1097)
日期:2017年05月20日 16点22分
try this
require('socket.io-client')('http://localhost', {
rejectUnauthorized: false,
})
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.
我有同样的问题。 然后我将我的客户端代码更改为
require('socket.io-client')('wss://myserver:port/ws', { transports: ['websocket'], rejectUnauthorized: false });
但是现在,我收到了 404 错误响应。 日志显示我的请求 url 中添加了一个额外的/socket.io/
。
{ Error: unexpected server response (404)
at ClientRequest._req.on (/Users/chris/Projects/nationsky/mgmt-server/backend/node_modules/ws/lib/WebSocket.js:650:26)
at emitOne (events.js:115:13)
at ClientRequest.emit (events.js:210:7)
at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:564:21)
at HTTPParser.parserOnHeadersComplete (_http_common.js:116:23)
at TLSSocket.socketOnData (_http_client.js:453:20)
at emitOne (events.js:115:13)
at TLSSocket.emit (events.js:210:7)
at addChunk (_stream_readable.js:252:12)
at readableAddChunk (_stream_readable.js:239:11)
type: 'error',
target:
WebSocket {
domain: null,
_events: [Object],
_eventsCount: 4,
_maxListeners: undefined,
readyState: 0,
bytesReceived: 0,
extensions: {},
protocol: '',
_binaryType: 'arraybuffer',
_finalize: [Function: bound finalize],
_finalizeCalled: false,
_closeMessage: null,
_closeTimer: null,
_closeCode: null,
_receiver: null,
_sender: null,
_socket: null,
_ultron: null,
protocolVersion: 13,
_isServer: false,
url: 'wss://myserver:port/socket.io/?access_token=HnbtDUEWu1i1HVrAn-DO9YOL6GZxoittWAf8Sz_RR0s&EIO=3&transport=websocket',
_req: [Object] } } }
对我来说,即使调试器不存在,它也会出现
你好! 我在尝试从 Node.js 应用程序连接到服务器时遇到了同样的问题,这是我的代码:
const socket = require('socket.io-client')('https://domain.com')
我运行DEBUG=engine* npm run dev
的日志是这样的:
engine.io-client:socket creating transport "polling" +2s
engine.io-client:polling polling +1ms
engine.io-client:polling-xhr xhr poll +0ms
engine.io-client:polling-xhr xhr open GET: https://domain.com/socket.io/?EIO=3&transport=polling&t=LzBM71r&b64=1 +0ms
engine.io-client:polling-xhr xhr data null +0ms
engine.io-client:socket setting transport polling +1ms
engine.io-client:socket socket error {"type":"TransportError","description":503} +7ms
engine.io-client:socket socket close with reason: "transport error" +0ms
engine.io-client:polling transport not open - deferring close +0ms
当我尝试从浏览器连接到https://domain.com/socket.io/socket.io.js
它工作并使用了io('https://domain.com')
,所以我按照评论中的说明进行操作,并将代码更改为:
const socket = require('socket.io-client')('https://domain.com', { rejectUnauthorized: false })
它有效,但很奇怪,我有来自Let's Encrypt 的有效证书,还是正常的? 无论如何..我添加了transports
选项(也来自评论)以避免除websocket
之外的其他连接,最后代码是:
const socket = require('socket.io-client')('https://domain.com', {
transports: ['websocket'],
rejectUnauthorized: false
})
谢谢@ibrahimduran和@SupremeTechnopriest :smile:
如果我写得像泰山,我很抱歉 :sweat_smile: 我正在学习我的英语哈哈
我遇到了这个问题,我花了 2 个小时解决这个问题,结果证明它只是正确指定了您的选项。 以下是您应该如何指定它们:
let socketClient = socketIOClient.connect(`http://localhost:3001`,{ // [1] Important as fuck
reconnectionDelay: 1000,
reconnection:true,
reconnectionAttempts: 10,
transports: ['websocket'],
agent: false, // [2] Please don't set this to true
upgrade: false,
rejectUnauthorized: false
});
[1] 如果不指定是使用 http 还是 https ,则默认为 https 。 或者,如果你不把URL指定为以后的端口正确“的网址。的COM:端口”默认为80或443取决于协议。 我见过一些 stackoverflow 的答案,这些答案将端口指定为选项对象中的一个选项。 我查看了代码,没有这样的选项。 您需要在 url 中包含端口。
[2] 而且,我将代理设置为 true 并且它无法建立 ws 连接并且没有错误,它只是超时。 只是根本不指定代理。 它默认为假。
@teja42我尝试解决这个问题 2 天。 我认为这是 webpack 的一个捆绑问题,但您的解决方案非常有效。 谢谢!
你好 !
我遇到了同样的问题并修复了从 2.0.1 降级到 1.7.4 的问题,正如@SupremeTechnopriest所说,一切正常!
谢谢 !
嗨,我在 Android 8.1 上尝试时仍然遇到这个问题:(
伪代码:
``
this.socket = io.connect('https://xxxxxxxxxxxxxx', {
路径:'/socketchannel',
重新连接延迟:1000,
重新连接:真,
重新连接尝试:10,
传输:['websocket'],
经纪人:假的,
升级:假,
拒绝未授权:假
});
this.socket.on('connect', () => {
console.log('套接字已连接!')
})
this.socket.on('connect_error', (err) => {
console.log('socket 连接错误 --> ' + err);
})
``
应用程序进入“connection_error”事件并记录“错误:websocket 错误”
“反应原生”:“0.57.4”,
“socket.io-client”:“1.7.4”
有什么建议?
应用程序进入“connection_error”事件并记录“错误:websocket 错误”
面临同样的问题
"react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
"engine.io-client": "~3.3.2",
"socket.io-client": "2.1.1",
我面临同样的问题,有什么更新吗?
+1为此
由于origins
的套接字服务器,我遇到了这个问题。
那么现在如何添加起源呢?
大家好。 所以我为我的节点快速服务器使用 PM2 集群并使用 redis 适配器:
const redis = require('socket.io-redis')
io.adapter(redis(config.redis))
对于浏览器客户端,这似乎很好,但对于 socket.io-client 我得到:
{ Error: xhr post error
at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:111:10)
at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
at listOnTimeout (timers.js:327:15)
at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }
{ Error: xhr poll error
at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:130:10)
at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
at listOnTimeout (timers.js:327:15)
at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }
如果我更改客户端代码以使用 websocket 传输,则一切正常。
var socket = require("socket.io-client")("http://localhost:8080", { transports: ['websocket'] });
问题是我不想要求将此代码更改为所有客户端代码。
如果 xhr 轮询传输失败,我的建议是更改 socket.io-client 以尝试使用 websocket 传输。 你怎么认为?
尝试从 github 上的最新版本,像这样,解决了我的 RN android 问题:
npm i socketio/engine.io-client#3.3.2 -S
干杯
我知道这个解决方案听起来有点奇怪,但我通过谷歌搜索这个错误来到这里。
在我的情况下,我得到这个是因为我的服务器没有运行(我认为是)。 希望能帮助别人:)
试试这个
require('socket.io-client')('http://localhost', { rejectUnauthorized: false, })
谢谢,我在从节点应用程序连接到我的服务器时遇到问题,这个解决方案对我来说很好。
试试这个
require('socket.io-client')('http://localhost', { rejectUnauthorized: false, })
谢谢,我在从节点应用程序连接到我的服务器时遇到问题,这个解决方案对我来说很好。
您好,我只是想知道您使用的是哪个版本的 socket.io 和 socket.io-client
试试这个
require('socket.io-client')('http://localhost', { rejectUnauthorized: false, })
谢谢,我在从节点应用程序连接到我的服务器时遇到问题,这个解决方案对我来说很好。
您好,我只是想知道您使用的是哪个版本的 socket.io 和 socket.io-client
我在 2.3.0 版本中同时使用 socket.io 和 socket.io-client。
嗨,我在 Android 8.1 上尝试时仍然遇到这个问题:(
伪代码:
this.socket = io.connect('https://xxxxxxxxxxxxxx', { path: '/socketchannel', reconnectionDelay: 1000, reconnection:true, reconnectionAttempts: 10, transports: ['websocket'], agent: false, upgrade: false, rejectUnauthorized: false }); this.socket.on('connect', () => { console.log('socket connected!') }) this.socket.on('connect_error', (err) => { console.log('socket connected error --> ' + err); })
应用程序进入“connection_error”事件并记录“错误:websocket 错误”
“反应原生”:“0.57.4”,
“socket.io-client”:“1.7.4”有什么建议?
同样的问题,你解决了吗?
我通过使用域名解决了我的问题。
最有用的评论
我一周前通过重构解决了我的问题,但我不记得究竟是什么解决了问题。 抱歉,我度过了忙碌的一周,这是最初的提交。
您可以尝试在客户端将
opts.transports
为仅websocket
:在重构代码之前,我的套接字和动作绑定逻辑太复杂了。 因此,请确保代码中的套接字逻辑正常工作并使其更易于调试。