Reverter para 2.1.1 corrige o problema.
Suspeito que tenha algo a ver com as novas mudanças na gestão do cors.
Definir manualmente as origens não parece fazer nada.
Ele começa a funcionar magicamente ao iniciar o depurador nativo react.
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']
teve o mesmo problema em ambas as plataformas (simulador) 2.1.1, ele só funciona com a ativação do depurador.
Eu também estou enfrentando esse problema. Eu atualizei para ver se isso corrige meu primeiro problema de latência de conexão.
Eu também estou enfrentando o mesmo. edição
Reverter para 2.1.1 funciona para mim.
Eu ainda estou enfrentando o mesmo problema de reverter 2.1.1 também não está funcionando para mim.
Deve ser corrigido em https://github.com/socketio/engine.io-client/pull/607.
@benhjames você poderia confirmar que sua correção corrigiu o problema no React Native?
Sim, atualmente estou executando [email protected]
(que puxou [email protected]
) no React Native sem problemas.
Vale a pena verificar se seu engine.io-client
é 3.3.2, pois contém a correção React Native para websockets. 😃
@benhjames @darrachequesne eu usei socket. [email protected] (que puxou [email protected]) e também verificar as mudanças em node_modules ainda, não está funcionando para mim.
`importar io de 'socket.io-client';
exportar a classe padrão HomeScreen extends React.Component {
construtor (adereços) {
super (adereços);
this.socket = io ('ws: //192.168.0.107: 8080 / endpoint', {
reconexão: verdadeiro,
reconnectionDelay: 500,
jsonp: false,
tentativas de reconexão: Infinity,
transportes: ['websocket']
});
this.socket.on ('connect_error', (err) => {
console.log (err)
});
}
`
Estou recebendo o erro abaixo:
Error: websocket error
at WS.Transport.onError (transport.js:67)
at WebSocket.ws.onerror (websocket.js:157)
at WebSocket.dispatchEvent (event-target.js:172)
at WebSocket.js:289
at RCTDeviceEventEmitter.emit (EventEmitter.js:190)
at MessageQueue.__callFunction (MessageQueue.js:349)
at MessageQueue.js:106
at MessageQueue.__guard (MessageQueue.js:297)
at MessageQueue.callFunctionReturnFlushedQueue (MessageQueue.js:105)
at debuggerWorker.js:72
Isso me parece que o ponto de extremidade está incorreto - deve ser um link de protocolo http
ou https
, não ws
one. 👍
@benhjames Eu tentei anteriormente com a API WebSocket https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API e estava funcionando perfeitamente bem com o mesmo protocolo.
socket.io (ao contrário da API WebSocket) só aceita um URI de protocolo HTTP (S) para o cliente ( consulte a documentação aqui ), mas _utiliza_ o protocolo WS nos bastidores.
Portanto, se você fizer io('http://192.168.0.107:8080/endpoint', ...)
, deve funcionar!
@benhjames, obrigado pela atualização!
Acho que ws://
deve funcionar corretamente, mas /endpoint
significa que você deseja se conectar ao namespace do endpoint (que é a implementação atual, a partir de v2.x). Você pode querer usar:
this.socket = io('ws://192.168.0.107:8080', {
path: '/endpoint',
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']
});
@darrachequesne Eu tentei a implementação acima, mas ainda não está funcionando.
Talvez seja útil ver a aparência do código do servidor SocketIO, apenas para ter certeza de que está usando o namespace e as configurações corretas, etc. 🙂
Está funcionando perfeitamente bem com a API WebSocket, mas quando tento me conectar com a API Socket.io, recebo um erro como abaixo:
websocket error
Stack trace:
null:null in WS.Transport.onError
node_modules/engine.io-client/lib/transports/websocket.js:178:8 in WebSocket.ws.onerror
node_modules/event-target-shim/lib/event-target.js:172:38 in WebSocket.dispatchEvent
node_modules/react-native/Libraries/WebSocket/WebSocket.js:289:13 in <unknown>
node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js:190:32 in RCTDeviceEventEmitter.emit
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:349:41 in MessageQueue.__callFunction
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:106:11 in <unknown>
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:297:8 in MessageQueue.__guard
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:105:9 in MessageQueue.callFunctionReturnFlushedQueue
http://192.168.0.103:19001/debugger-ui/debuggerWorker.js:72:58 in <unknown>
Se funcionar com a API WebSocket sem lógica personalizada para desserializar cargas úteis de socket.io, isso significa que o servidor não está usando socket.io.
Existe alguma chance de você fornecer algum código do servidor para verificar se é esse o caso?
@benhjames Isso mesmo, estamos usando https://docs.oracle.com/javaee/7/api/javax/websocket/package-summary.html para código de back-end.
Isso explica tudo então! O Socket.io precisa ser usado _both_ no cliente e no servidor para funcionar. 👍
@benhjames @darrachequesne Agora estou usando socket.io no backend, está funcionando bem no frontend com vanilla javascript usando socket.io, mas quando tento conectar socket.io através do React Native estou recebendo o erro:
Vanilla JS (funcionando perfeitamente bem):
`` `
<script>
var socket = io.connect('http://localhost:9092');
socket.on('connect', function() {
output('<span class="connect-msg">Client has connected to the server!</span>');
});
**React Native code: (Not working)**
this.socket = io.connect('http://localhost:9092',{
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']});
this.socket.on('connect',function(e){
console.log("on Connect");
})
this.socket.on('connect_error', (err) => {
console.log(err)
});
**Error:**
17:15
websocket error
Stack trace:
node_modules/engine.io-client/lib/transport.js:67:22 in onError
node_modules/engine.io-client/lib/transports/websocket.js:157:17 in onerror
node_modules/event-target-shim/lib/event-target.js:172:43 in dispatchEvent
node_modules/react-native/Libraries/WebSocket/WebSocket.js:290:10 in
node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js:191:12 in emit
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:349:47 in __callFunction
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:106:26 in
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:297:10 in __guard
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:105:17 in callFunctionReturnFlushedQueue
```
I am using https://github.com/mrniko/netty-socketio in backend.
Pode ser necessário conectar-se a uma URL de host não local (ou seja, o IP do seu computador) dentro do React Native: certamente no Android e possivelmente no iOS, dependendo de qual simulador está sendo usado.
Se isso ainda não funcionar, vale a pena tentar a opção transports: ['polling']
para ver se realmente é o transporte WebSocket em particular que não está funcionando ou se é um problema de conexão de rede mais geral.
@benhjames Estou enfrentando um problema estranho. Estou usando https://github.com/mrniko/netty-socketio no backend e se estou usando Vanilla JS como mencionado acima, está funcionando perfeitamente, mas se estou usando com react-native, servidor mostrando uma conexão bem-sucedida, mas em react-native, estou recebendo um erro de conexão conforme abaixo:
server error
Stack trace:
node_modules/engine.io-client/lib/socket.js:453:28 in onPacket
node_modules/engine.io-client/lib/socket.js:276:18 in <unknown>
node_modules/component-emitter/index.js:133:25 in emit
node_modules/engine.io-client/lib/transport.js:148:12 in onPacket
node_modules/engine.io-client/lib/transports/polling.js:144:18 in callback
node_modules/engine.io-parser/lib/browser.js:384:20 in decodePayload
node_modules/engine.io-client/lib/transports/polling.js:148:23 in onData
node_modules/engine.io-client/lib/transports/polling-xhr.js:127:16 in <unknown>
node_modules/component-emitter/index.js:133:25 in emit
node_modules/engine.io-client/lib/transports/polling-xhr.js:300:12 in onData
node_modules/engine.io-client/lib/transports/polling-xhr.js:367:16 in onLoad
node_modules/engine.io-client/lib/transports/polling-xhr.js:253:10 in onreadystatechange
node_modules/event-target-shim/lib/event-target.js:172:43 in dispatchEvent
node_modules/react-native/Libraries/Network/XMLHttpRequest.js:570:23 in setReadyState
node_modules/react-native/Libraries/Network/XMLHttpRequest.js:392:25 in __didCompleteResponse
node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js:191:12 in emit
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:349:47 in __callFunction
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:106:26 in <unknown>
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:297:10 in __guard
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:105:17 in callFunctionReturnFlushedQueue
...
PS:
Com o NodeJS está funcionando perfeitamente bem sem nenhum erro.
Por favor, veja a resposta acima!
Obrigado, @benhjames pelo seu apoio, está funcionando agora. https://github.com/mrniko/netty-socketio/issues/614
Eu tenho o mesmo problema, não importa se escolhi websockets ou polling. É um websocket_error ou um erro de votação xhr.
O URL é um IP (http://192.168.1.112:3000) e estou me conectando de um telefone físico a um computador na mesma rede local usando React Native Expo.
Posso ajudar se você precisar de mais rastreamentos de pilha ou informações ...
socket.io 2.2.0 // cliente e servidor
engine.io 3.3.2 // cliente e servidor
Soa como um problema fora do socket.io, se o websocket e o polling transport não estiverem funcionando. Você pode querer tentar:
fetch
ao seu servidor. Se isso não funcionar, é provável que haja um problema com a rede ou com o ambiente React Native.Vou tentar o primeiro teste, a busca normal funciona
EDIT: parece um problema relacionado ao CORS. Se tento conectar um cliente JS simples, obtenho:
Access to XMLHttpRequest at 'http://192.168.1.112:3000/socket.io/?EIO=3&transport=polling&t=MfV8vhI' from origin 'http://192.168.1.112:5000' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
Algum conselho sobre como configurar isso?
tentar a última versão do github, assim, resolveu meus problemas com RN android:
npm i socketio/engine.io-client#3.3.2 -S
Nada parece funcionar com o react nativo 0,60
A versão de versão do Android não funciona ao usar RN 0.60.5
Tentei versões do socket.io-client 2.0.4, 2.1.1, 2.2.0.
Tentei yarn add socketio/engine.io-client#3.3.2
Consulte # 1305 - no Android, você precisa usar https ou definir o atributo usesCleartextTraffic em AndroidManifest
tente v2.3
Eu tentei com o Expo SDK v34 e v35 (RN 0,59) e tive que fazer o downgrade do socket.io-client para 1.7.2 ( yarn add [email protected]
) como outras versões (2.1.1, 2.1.0, 2.2.0) fizeram Não funciona. Não tentei 2.3.0, agora que funciona, não quero problemas :-)
Olá @lionbur , como eu sei, existem muitos mini-versão de 0,59. Qual versão você está usando? 0,59,9?
Agradeço antecipadamente!
Comentários muito úteis
Nada parece funcionar com o react nativo 0,60