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.
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']
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):
```
<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.
Es kann erforderlich sein, innerhalb von React Native eine Verbindung zu einer nicht-lokalen Host-URL (dh der IP Ihres Computers) herzustellen: sicherlich in Android und möglicherweise in iOS, je nachdem, welcher Simulator verwendet wird.
Wenn dies immer noch nicht funktioniert, sollten Sie die Option transports: ['polling']
ausprobieren, um zu sehen, ob wirklich insbesondere der WebSocket-Transport nicht funktioniert oder ob es sich um ein allgemeineres Netzwerkverbindungsproblem handelt.
@benhjames Ich stehe vor einem seltsamen Problem. Ich verwende https://github.com/mrniko/netty-socketio im Backend und wenn ich Vanilla JS wie oben erwähnt verwende, funktioniert es einwandfrei, aber wenn ich mit React-native verwende, zeigt der Server eine erfolgreiche Verbindung an, aber in React-native, ich erhalte einen Verbindungsfehler wie folgt:
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:
Mit NodeJS funktioniert es einwandfrei ohne Fehler.
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:
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!
Hilfreichster Kommentar
Nichts scheint mit React native 0.60 . zu funktionieren