Socket.io-client: الإصدار 2.2 لا يعمل مع التفاعل الأصلي

تم إنشاؤها على ٢١ ديسمبر ٢٠١٨  ·  32تعليقات  ·  مصدر: socketio/socket.io-client

العودة إلى الإصدار 2.1.1 يعمل على إصلاح المشكلة.

أظن أن له علاقة بالتغييرات الجديدة في إدارة الكورسات.
لا يبدو أن تحديد الأصول يدويًا يؤدي إلى أي شيء.

يبدأ العمل بطريقة سحرية عند تشغيل مصحح أخطاء التفاعل الأصلي.

التكوين

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

اقامة

  • نظام التشغيل: iOS
  • المتصفح: رد فعل أصلي
  • الإصدار socket.io: 2.2.0

التعليق الأكثر فائدة

لا شيء يبدو أنه يعمل مع التفاعل الأصلي 0.60

ال 32 كومينتر

واجهت نفس المشكلة على كلا النظامين الأساسيين (المحاكاة) 2.1.1 ، فهي تعمل فقط مع تشغيل مصحح الأخطاء.

أنا أيضا أواجه هذه المشكلة. لقد قمت بالترقية لمعرفة ما إذا كانت ستصلح أول مشكلة تتعلق بزمن الاتصال أم لا.

أنا أيضا أواجه نفس الشيء. مشكلة

العودة إلى 2.1.1 يعمل بالنسبة لي.

ما زلت أواجه نفس المشكلة التي تعود 2.1.1 أيضًا لا تعمل من أجلي.

يجب إصلاحه من خلال https://github.com/socketio/engine.io-client/pull/607.

benhjames هل يمكنك التأكد من أن الإصلاح الخاص بك قد أصلح المشكلة في React Native؟

نعم ، أنا حاليًا أقوم بتشغيل [email protected] (الذي سحب [email protected] ) على React Native بدون مشكلة.

يجدر التحقق للتأكد من أن engine.io-client الخاص بك هو 3.3.2 ، حيث يحتوي هذا على الإصلاح الأصلي لمقابس الويب. 😃

benhjamesdarrachequesne لدي مأخذ المستخدمة. [email protected] (التي تم سحبها في [email protected]) وتحقق أيضًا من التغييرات في node_modules لا تزال ، إنها لا تعمل بالنسبة لي.

"استيراد io من" socket.io-client "؛

يقوم برنامج HomeScreen الخاص بتصدير الفئة الافتراضية بتوسيع React.Component {
المُنشئ (الدعائم) {
سوبر (الدعائم) ؛
this.socket = io ('ws: //192.168.0.107: 8080 / endpoint'، {
إعادة الاتصال: صحيح ،
إعادة الاتصال التأخير: 500 ،
jsonp: خطأ ،
إعادة الاتصال المحاولات: إنفينيتي ،
النقل: ["websocket"]
}) ؛
this.socket.on ('connect_error'، (يخطئ) => {
console.log (يخطئ)
}) ؛
}
"

أتلقى الخطأ على النحو التالي:
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

يبدو لي أن نقطة النهاية غير صحيحة - يجب أن تكون رابط بروتوكول http أو https ، وليس ws واحد. 👍

benhjames حاولت سابقًا استخدام WebSocket API https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API وكان يعمل بشكل جيد تمامًا مع نفس البروتوكول.

socket.io (على عكس WebSocket API) يقبل فقط بروتوكول HTTP (S) URI للعميل ( انظر المستندات هنا ) ، ولكنه لا يستخدم بروتوكول WS خلف الكواليس.

لذلك إذا قمت بعمل io('http://192.168.0.107:8080/endpoint', ...) ، فيجب أن تعمل!

benhjames شكرا على التحديث!

أعتقد أن ws:// يجب أن يعمل بشكل صحيح ، لكن /endpoint يعني أنك تريد الاتصال بمساحة اسم نقطة النهاية (هذا هو التطبيق الحالي ، بدءًا من الإصدار 2.x). قد ترغب في استخدام:

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

darrachequesne لقد حاولت أعلاه التنفيذ لكنه لا يزال لا يعمل.

ربما يكون من المفيد رؤية شكل رمز خادم SocketIO ، فقط للتأكد من أنه يستخدم مساحة الاسم والإعدادات الصحيحة وما إلى ذلك 🙂

إنه يعمل بشكل جيد مع WebSocket API ولكن عندما أحاول الاتصال بـ Socket.io API ، أتلقى خطأ على النحو التالي:

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>

إذا كان يعمل مع WebSocket API بدون منطق مخصص لإلغاء تسلسل حمولات socket.io ، فهذا يعني أن الخادم لا يستخدم socket.io.

هل هناك أي فرصة لتقديم بعض التعليمات البرمجية من الخادم للتحقق مما إذا كانت هذه هي الحالة؟

benhjames هذا صحيح نحن نستخدم https://docs.oracle.com/javaee/7/api/javax/websocket/package-summary.html للرمز الخلفي.

هذا ما يفسر ذلك إذن! يحتاج Socket.io إلى أن يتم استخدامه على كل من العميل والخادم للعمل. 👍

benhjamesdarrachequesne الآن أنا باستخدام socket.io في الخلفية، وانها تعمل بشكل جيد على الواجهة مع الفانيليا جافا سكريبت باستخدام socket.io ولكن عندما أحاول ربط socket.io من خلال ردة الفعل الأصلية أنا على الحصول على الخطأ:

Vanilla JS (يعمل بشكل جيد تمامًا):

""

يرجى الاطلاع على الجواب أعلاه!

شكرًا ، benhjames على دعمكم ، إنه يعمل الآن. https://github.com/mrniko/netty-socketio/issues/614

لدي نفس المشكلة بغض النظر عما إذا اخترت Websocket أو الاقتراع. إما خطأ websocket_error أو خطأ استطلاع xhr.

عنوان URL هو عنوان IP (http://192.168.1.112:3000) وأنا أقوم بالاتصال من هاتف فعلي بجهاز كمبيوتر على نفس الشبكة المحلية باستخدام React Native Expo.

يمكنني المساعدة إذا كنت بحاجة إلى مزيد من تتبع المكدس أو المعلومات ...

socket.io 2.2.0 // كل من العميل والخادم
engine.io 3.3.2 // كل من العميل والخادم

يبدو وكأنه مشكلة خارج socket.io ، إذا كان كل من مقبس الويب ونقل الاقتراع لا يعملان. قد ترغب في المحاولة:

  • الاتصال بخادم socket.io خارج React Native ، باستخدام عميل socket.io في متصفح. إذا لم ينجح ذلك أيضًا ، فمن المحتمل أن تكون هناك مشكلة في الخادم.
  • إجراء طلب عادي fetch إلى الخادم الخاص بك. إذا لم يفلح ذلك ، فمن المحتمل أن تكون هناك مشكلة في الشبكة أو بيئة React Native.

سأحاول الاختبار الأول ، الجلب العادي يعمل

تحرير: يبدو أنه مشكلة متعلقة بـ CORS. إذا حاولت توصيل عميل JS بسيط ، فسأحصل على:

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.

أي نصيحة حول كيفية إعداد هذا؟

جرب الإصدار الأخير من جيثب ، مثل هذا ، حل مشاكلي مع RN android:

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

لا شيء يبدو أنه يعمل مع التفاعل الأصلي 0.60

لا يعمل إصدار Android عند استخدام RN 0.60.5

تم تجربة إصدارات socket.io-client 2.0.4 و 2.1.1 و 2.2.0.

حاولت yarn add socketio/engine.io-client#3.3.2

انظر # 1305 - على Android ، تحتاج إلى استخدام https أو تعيين سمة الاستخدامات CleartextTraffic في AndroidManifest

جرب v2.3

حاولت استخدام Expo SDK v34 و v35 (RN 0.59) واضطررت إلى الرجوع إلى إصدار أقدم من socket.io-client إلى 1.7.2 ( yarn add [email protected] ) كما فعلت الإصدارات الأخرى (2.1.1 ، 2.1.0 ، 2.2.0) لا يعمل. لم أحاول 2.3.0 ، الآن بعد أن نجحت ، لا أريد مشاكل :-)

مرحبًا lionbur ، كما أعلم أن هناك العديد من الإصدارات المصغرة من 0.59. ما هو الإصدار الذي تستخدمه؟ 0.59.9؟

شكرا لكم مقدما!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

david-fong picture david-fong  ·  4تعليقات

catamphetamine picture catamphetamine  ·  3تعليقات

vadimka123 picture vadimka123  ·  6تعليقات

crazyyi picture crazyyi  ·  5تعليقات

exilonX picture exilonX  ·  7تعليقات