Socket.io-client: Version 2.2 funktioniert nicht mit React native

Erstellt am 21. Dez. 2018  ·  32Kommentare  ·  Quelle: socketio/socket.io-client

Das Zurücksetzen auf 2.1.1 behebt das Problem.

Ich vermute, es hat etwas mit den neuen Änderungen im Cors-Management zu tun.
Das manuelle Festlegen von Ursprüngen scheint nichts zu tun.

Es beginnt auf magische Weise zu funktionieren, wenn der native Debugger von React gestartet wird.

Konfig

reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']

Aufstellen

  • Betriebssystem: iOS
  • Browser: Reaktiv-nativ
  • socket.io-Version: 2.2.0

Hilfreichster Kommentar

Nichts scheint mit React native 0.60 . zu funktionieren

Alle 32 Kommentare

das gleiche Problem auf beiden Plattformen (Simulator) 2.1.1 aufgetreten ist, funktioniert es nur, wenn der Debugger eingeschaltet ist.

ich stehe auch vor diesem Problem. Ich habe ein Upgrade durchgeführt, um zu sehen, ob es mein erstes Problem mit der Verbindungslatenz behebt.

ich stehe auch vor dem gleichen. Ausgabe

Die Rückkehr zu 2.1.1 funktioniert für mich.

Ich stehe immer noch vor dem gleichen Problem, bei dem 2.1.1 zurückgesetzt wird, das auch bei mir nicht funktioniert.

Es sollte von https://github.com/socketio/engine.io-client/pull/607 behoben werden

@benhjames könnten Sie bestätigen, dass Ihr Fix das Problem in React Native behoben hat?

Ja, ich führe derzeit [email protected] (was [email protected] eingezogen hat) auf React Native ohne Probleme aus.

Es lohnt sich zu überprüfen, ob Ihr engine.io-client 3.3.2 ist, da dies den React Native Fix für Websockets enthält. 😃

@benhjames @darrachequesne Ich habe Socket verwendet. [email protected] (der

`io aus 'socket.io-client' importieren;

export default class HomeScreen erweitert React.Component {
Konstruktor (Requisiten) {
super (Requisiten);
this.socket = io('ws://192.168.0.107:8080/endpoint',{
Wiederverbindung: wahr,-
Wiederverbindungsverzögerung: 500,
jsonp: falsch,
Wiederverbindungsversuche: Unendlich,
Transporte: ['websocket']
});
this.socket.on('connect_error', (err) => {
Konsole.log(err)
});
}
`

Ich erhalte den Fehler wie folgt:
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

Das sieht für mich so aus, als ob der Endpunkt falsch ist - es sollte ein http oder https Protokolllink sein, kein ws Link. 👍

@benhjames Ich habe es früher mit der WebSocket-API https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API versucht und es hat mit demselben Protokoll einwandfrei funktioniert.

socket.io (im Gegensatz zur WebSocket-API) akzeptiert nur einen HTTP(S)-Protokoll-URI für den Client ( siehe die Dokumentation hier ), aber es _verwendet_ das WS-Protokoll hinter den Kulissen.

Wenn Sie also io('http://192.168.0.107:8080/endpoint', ...) tun, sollte es funktionieren!

@benhjames danke für das Update!

Ich denke, dass ws:// ordnungsgemäß funktionieren sollte, aber /endpoint bedeutet, dass Sie eine Verbindung zum Endpunkt-Namespace herstellen möchten (das ist die aktuelle Implementierung ab v2.x). Sie können Folgendes verwenden:

this.socket = io('ws://192.168.0.107:8080', {
  path: '/endpoint',
  reconnection: true,
  reconnectionDelay: 500,
  jsonp: false,
  reconnectionAttempts: Infinity,
  transports: ['websocket']
});

@darrachequesne Ich habe die obige Implementierung ausprobiert, aber es funktioniert immer noch nicht.

Vielleicht ist es nützlich zu sehen, wie der SocketIO-Servercode aussieht, nur um sicherzustellen, dass er den richtigen Namespace und die richtigen Einstellungen verwendet usw. 🙂

Es funktioniert einwandfrei mit der WebSocket-API, aber wenn ich versuche, eine Verbindung mit der Socket.io-API herzustellen, erhalte ich eine Fehlermeldung wie folgt:

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>

Wenn es mit der WebSocket-API ohne benutzerdefinierte Logik zum Unserialisieren von socket.io-Nutzlasten funktioniert, bedeutet dies, dass der Server socket.io nicht verwendet.

Besteht die Möglichkeit, dass Sie einen Code vom Server bereitstellen, um zu überprüfen, ob dies der Fall ist?

@benhjames Richtig , wir verwenden https://docs.oracle.com/javaee/7/api/javax/websocket/package-summary.html für Backend-Code.

Das erklärt es dann! Socket.io muss sowohl auf dem Client als auch auf dem Server verwendet werden, um zu funktionieren. 👍

@benhjames @darrachequesne Jetzt verwende ich socket.io im Backend, es funktioniert im Frontend mit Vanille-Javascript mit socket.io gut, aber wenn ich versuche, socket.io über React Native zu verbinden, erhalte ich den Fehler:

Vanille JS (funktioniert einwandfrei):

```

Bitte beachten Sie die obige Antwort!

Danke @benhjames für deine Unterstützung, es funktioniert jetzt. https://github.com/mrniko/netty-socketio/issues/614

Ich habe das gleiche Problem, egal ob ich Websockets oder Polling gewählt habe. Es ist entweder ein websocket_error oder ein xhr-Abfragefehler.

Die URL ist eine IP (http://192.168.1.112:3000) und ich stelle mit React Native Expo eine Verbindung von einem physischen Telefon zu einem Computer im selben lokalen Netzwerk her.

Ich kann helfen, wenn Sie weitere Stack-Traces oder Informationen benötigen ...

socket.io 2.2.0 // sowohl Client als auch Server
engine.io 3.3.2 // sowohl Client als auch Server

Klingt nach einem Problem außerhalb von socket.io, wenn sowohl der Websocket- als auch der Polling-Transport nicht funktionieren. Vielleicht möchten Sie Folgendes versuchen:

  • Herstellen einer Verbindung mit dem socket.io-Server außerhalb von React Native über den socket.io-Client in einem Browser. Wenn auch das nicht funktioniert, liegt wahrscheinlich ein Problem mit dem Server vor.
  • Stellen Sie eine normale fetch Anfrage an Ihren Server. Wenn das nicht funktioniert, liegt wahrscheinlich ein Problem mit dem Netzwerk oder der React Native-Umgebung vor.

Werde den ersten Test versuchen, der normale Abruf funktioniert

EDIT: Es sieht aus wie ein CORS-bezogenes Problem. Wenn ich versuche, einen einfachen JS-Client zu verbinden, erhalte ich:

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.

Irgendwelche Ratschläge, wie man das einrichtet?

Versuchen Sie die letzte Version von github, wie folgt, meine Probleme mit RN Android gelöst:

npm i socketio/engine.io-client#3.3.2 -S

Nichts scheint mit React native 0.60 . zu funktionieren

Android Release Build funktioniert nicht bei Verwendung von RN 0.60.5

Erprobte socket.io-Client-Versionen 2.0.4, 2.1.1, 2.2.0.

Versucht yarn add socketio/engine.io-client#3.3.2

Siehe Nr. 1305 - auf Android müssen Sie https verwenden oder das Attribut usesCleartextTraffic in AndroidManifest setzen

versuch es mit v2.3

Ich habe es mit Expo SDK v34 und v35 (RN 0.59) versucht und musste socket.io-client auf 1.7.2 ( yarn add [email protected] ) downgraden, wie es andere Versionen (2.1.1, 2.1.0, 2.2.0) taten Nicht arbeiten. 2.3.0 habe ich nicht probiert, jetzt wo es funktioniert will ich keine Probleme mehr :-)

Hallo @lionbur , wie ich weiß gibt es viele Miniversionen von 0.59. Welche Version verwendest du? 0,59,9?

Vielen Dank im Voraus!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen