Kembali ke 2.1.1 memperbaiki masalah.
Saya menduga itu ada hubungannya dengan perubahan manajemen kor yang baru.
Pengaturan asal secara manual sepertinya tidak melakukan apa-apa.
Ini secara ajaib mulai bekerja ketika meluncurkan debugger asli reaksi.
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']
mengalami masalah yang sama pada kedua platform (simulator) 2.1.1, ini hanya berfungsi dengan mengaktifkan debugger.
Saya juga menghadapi masalah ini. Saya memutakhirkan untuk melihat apakah itu memperbaiki masalah latensi koneksi pertama saya.
Saya juga menghadapi hal yang sama. isu
Kembali ke 2.1.1 berfungsi untuk saya.
Saya masih menghadapi masalah yang sama saat mengembalikan 2.1.1 juga tidak berfungsi untuk saya.
Itu harus diperbaiki oleh https://github.com/socketio/engine.io-client/pull/607.
@benhjames, bisakah Anda mengonfirmasi bahwa perbaikan Anda telah memperbaiki masalah di React Native?
Ya, saya saat ini menjalankan [email protected]
(yang telah menarik [email protected]
) di React Native tanpa masalah.
Sebaiknya periksa untuk memastikan engine.io-client
adalah 3.3.2, karena ini berisi perbaikan React Native untuk soket web. 😃
@benhjames @darrachequesne Saya telah menggunakan socket. [email protected] (yang telah menarik [email protected]) dan juga memverifikasi perubahan pada node_modules, itu tidak berfungsi untuk saya.
`impor io dari 'socket.io-client';
ekspor kelas default HomeScreen meluas React.Component {
konstruktor(alat peraga){
super(alat peraga);
this.socket = io('ws://192.168.0.107:8080/endpoint',{
rekoneksi: benar,
rekoneksiDelay: 500,
jsonp: salah,
upaya penyambungan kembali: Tak terhingga,
transportasi: ['websocket']
});
this.socket.on('connect_error', (err) => {
console.log(err)
});
}
`
Saya mendapatkan kesalahan seperti di bawah ini:
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
Bagi saya sepertinya titik akhir salah - itu seharusnya tautan protokol http
atau https
, bukan ws
. 👍
@benhjames Saya sebelumnya mencoba dengan WebSocket API https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API dan itu berfungsi dengan baik dengan protokol yang sama.
socket.io (tidak seperti WebSocket API) hanya menerima URI protokol HTTP(S) untuk klien ( lihat dokumen di sini ), tetapi ia _menggunakan_ protokol WS di belakang layar.
Jadi jika Anda melakukan io('http://192.168.0.107:8080/endpoint', ...)
itu akan berhasil!
@benhjames terima kasih atas pembaruannya!
Saya pikir ws://
harus berfungsi dengan baik, tetapi /endpoint
berarti Anda ingin terhubung ke namespace titik akhir (itulah implementasi saat ini, pada v2.x). Anda mungkin ingin menggunakan:
this.socket = io('ws://192.168.0.107:8080', {
path: '/endpoint',
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']
});
@darrachequesne Saya sudah mencoba implementasi di atas tetapi masih tidak berhasil.
Mungkin berguna melihat seperti apa kode server SocketIO, hanya untuk memastikan itu menggunakan namespace dan pengaturan yang tepat, dll.
Ini berfungsi dengan baik dengan WebSocket API tetapi ketika saya mencoba terhubung dengan Socket.io API saya mendapatkan kesalahan seperti di bawah ini:
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>
Jika bekerja dengan WebSocket API tanpa logika khusus untuk membatalkan serial payload socket.io, maka itu menyiratkan bahwa server tidak menggunakan socket.io.
Apakah ada kemungkinan Anda dapat memberikan beberapa kode dari server untuk memverifikasi jika ini masalahnya?
@benhjames Itu benar kami menggunakan https://docs.Oracle.com/javaee/7/api/javax/websocket/package-summary.html untuk kode backend.
Itu menjelaskannya kalau begitu! Socket.io perlu digunakan pada _keduanya_ klien dan server agar berfungsi. 👍
@benhjames @darrachequesne Sekarang saya menggunakan socket.io di backend, itu berfungsi dengan baik di frontend dengan vanilla javascript menggunakan socket.io tetapi ketika saya mencoba menghubungkan socket.io melalui React Native saya mendapatkan kesalahan:
Vanilla JS (Bekerja dengan sangat baik):
```
<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.
Mungkin diperlukan untuk terhubung ke URL non-localhost (yaitu IP komputer Anda) di dalam React Native: tentu saja di Android dan mungkin di iOS tergantung pada simulator mana yang digunakan.
Jika itu masih tidak berhasil, maka ada baiknya mencoba opsi transports: ['polling']
untuk melihat apakah benar-benar transport WebSocket yang tidak berfungsi, atau apakah itu masalah koneksi jaringan yang lebih umum.
@benhjames saya menghadapi masalah aneh. Saya menggunakan https://github.com/mrniko/netty-socketio di backend dan jika saya menggunakan Vanilla JS seperti yang disebutkan di atas, itu berfungsi dengan baik tetapi jika saya menggunakan dengan reaksi asli, server menunjukkan koneksi yang berhasil tetapi dalam react-native, saya mendapatkan kesalahan koneksi seperti di bawah ini:
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:
Dengan NodeJS itu berfungsi dengan baik tanpa kesalahan.
Silakan lihat jawaban di atas!
Terima kasih, @benhjames atas dukungan Anda, Ini berfungsi sekarang. https://github.com/mrniko/netty-socketio/issues/614
Saya memiliki masalah yang sama tidak peduli apakah saya memilih soket web atau polling. Baik itu kesalahan websocket_error atau kesalahan polling xhr.
URL adalah IP (http://192.168.1.112:3000) dan saya menghubungkan dari telepon fisik ke komputer di jaringan lokal yang sama menggunakan React Native Expo.
Saya dapat membantu jika Anda membutuhkan lebih banyak jejak tumpukan atau info ...
socket.io 2.2.0 // klien dan server
engine.io 3.3.2 // klien dan server
Kedengarannya seperti masalah di luar socket.io, jika websocket dan transportasi polling tidak berfungsi. Anda mungkin ingin mencoba:
fetch
normal ke server Anda. Jika itu tidak berhasil, kemungkinan ada masalah dengan jaringan atau lingkungan React Native.Akan mencoba tes pertama, pengambilan normal berfungsi
EDIT: sepertinya masalah terkait CORS. Jika saya mencoba menghubungkan klien JS sederhana, saya mendapatkan:
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.
Adakah saran tentang cara mengatur ini?
coba versi terakhir dari github, seperti ini, selesaikan masalah saya dengan RN Android:
npm i socketio/engine.io-client#3.3.2 -S
Sepertinya tidak ada yang bekerja dengan reaksi asli 0.60
Versi rilis Android tidak berfungsi saat menggunakan RN 0.60.5
Mencoba socket.io-client versi 2.0.4, 2.1.1, 2.2.0.
Mencoba yarn add socketio/engine.io-client#3.3.2
Lihat #1305 - di Android Anda perlu menggunakan https atau menyetel atribut usingCleartextTraffic di AndroidManifest
coba v2.3
Saya mencoba dengan Expo SDK v34 dan v35 (RN 0.59) dan harus menurunkan socket.io-client ke 1.7.2 ( yarn add [email protected]
) seperti yang dilakukan versi lain (2.1.1, 2.1.0, 2.2.0) Tidak bekerja. Saya tidak mencoba 2.3.0, sekarang berfungsi, saya tidak ingin ada masalah :-)
Hai @lionbur , seperti yang saya tahu ada banyak versi mini 0.59. Versi mana yang Anda gunakan? 0.59.9?
Terima kasih sebelumnya!
Komentar yang paling membantu
Sepertinya tidak ada yang bekerja dengan reaksi asli 0.60