Socket.io-client: Connect -> Disconnect -> Connect لا يعمل

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

الكود التالي لا يناسبني:
المقبس = io.connect ('http://host.com:8081') ؛ socket.disconnect () ؛ المقبس = io.connect ('http://host.com:8081') ؛

هذا هو الحل الذي وجدته:
socket = io.connect ('http://host.com:8081') ؛ socket.disconnect () ؛ حذف io.sockets [' http://host.com : 8081'] ؛ io.j = [] ؛ المقبس = io.connect ('http://host.com:8081') ؛

Unable to reproduce bug

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

استخدم هذا: io.connect(null,{'force new connection':true});

ال 33 كومينتر

نفس المشكلة هنا - تعذر الاتصال-قطع الاتصال-إعادة الاتصال بالطريقة التي وصفتها.

ومع ذلك ، وجدت أن الأعمال التالية. الغريب ، إذا حذفت setTimeout وأعدت الاتصال على الفور (أو بعد مهلة قصيرة جدًا) ، فسيتم قطع اتصالك على الفور.

var ns = io.connect(
        '/',
        { reconnect: false }
    ),
    numDisconnects = 2;

ns.on('connect', function () {

    console.log('Connected');

    if (numDisconnects > 0) {
        console.log('Disconnecting');
        ns.socket.disconnect();

        setTimeout(function () {
            console.log('Reconnecting');
            ns.socket.connect();
        }, 5000);
    }
    numDisconnects--;


});

ns.on('disconnect', function () {
    console.log('Disconnected');
});

مقبس = io.connect (مضيف) ؛
socket.donnect () ؛
socket.socket.reconnect () ؛ || socket.socket.connect (المضيف) ؛
يعمل ، ولكن منذ إعادة الاتصال أو الاتصال الثاني ، يتم تشغيل قطع الاتصال كل ثانيتين

واجهت نفس المشكلة لذا لم أتمكن من إنهاء إدخال خروج المغلوب في العقدة في الوقت المناسب بسبب هذا الخطأ :(
يرجى إصلاحها قبل أي كسر قلب آخر!

لم تعمل أي من الحلول المذكورة أعلاه بالنسبة لي. يا رفاق ، هذا سدادة عرض خطيرة. لماذا علامة "غير قادر على إعادة الإنتاج"؟ بلدي اختبار البيئة. هو أحدث إصدار من Chrome على OS X 10.6.

أنا أرى نفس الشيء. أيضًا استدعاء io.connect() للمرة الثانية يفشل بدون أخطاء. هل قام أي شخص العثور على الحل؟

استخدم هذا: io.connect(null,{'force new connection':true});

كم هو ملائم وقبيح. ماذا عن إزالة io.sockets[uuri] = socket; من io.js:196 ؟ ما الهدف من خط اللكمة هذا؟

لسوء الحظ ، نفس المشكلة هنا. لا يمكنك إعادة الاتصال بعد قطع الاتصال.

الشيء الوحيد الذي نجح معي بعد انقطاع الاتصال:
io.j = [] ،
io.sockets = [] ،

تحرير: إنها ليست مشكلة واحدة فقط من قطع الاتصال من جانب العميل (). لا يقوم بتنظيف هياكل البيانات عند قطع الاتصال - يمكنك رؤية ذلك SocketNamespace. لا يزال لدى أحداث $ جميع عمليات رد الاتصال للاتصالات المغلقة ، وما إلى ذلك.

MrJoes استخدم io.connect(null,{'force new connection':true});

حسنًا ، هل هذه حقًا واجهة برمجة التطبيقات النهائية لإعادة الاتصال؟ أفضل غريب.

skrat أتفق معك. يجب أن يكون هناك API io.reconnect .

لا أعتقد ذلك ، يجب أن يعمل io.connect ثم io.disconnect ثم io.connect كما هو متوقع.

milani : وتسريب الذاكرة بسبب المقابس المعزولة ، ومعالجات الأحداث ، وما إلى ذلك البقاء في io.sockets []؟

ليست فكرة جيدة جدا أن نكون صادقين.

MrJoes هل أنت متأكد من تسرب الذاكرة؟ @ 3rd-Eden من io.socket أخبرني باستخدام واجهة برمجة التطبيقات هذه.

بغض النظر ، لن يضيف مقبسًا إلى io.sockets [] إذا قمت بتمرير "فرض اتصال جديد".

على الرغم من أنها قبيحة بعض الشيء ، خاصة مع نقاط النهاية ، لأنك تفقد تعدد الإرسال - فهي تعتمد على المقبس في مقابس io.s للقيام بتعدد الإرسال.

اقتراح Gorokhov لاستخدام إعادة الاتصال من خلال النموذج الأولي للمقبس كان جيدًا بالنسبة لي:
socket.socket.reconnect ()
شكرا

نفس المشكلة هنا - socket.reconnect () لا يعمل معي ، سأحاول بعض الحلول الأخرى. هذا أمر مخيب للآمال ، على الرغم من أنه جزء أساسي من الوظائف لكسر في التحديث. أنا متأكد من أن الكثير من التطبيقات غير قادرة على التحديث بسهولة بسبب هذا.

إذا احتاج المطورون إلى أي مساعدة في إعادة إظهار المشكلة ، يسعدني تقديم المساعدة - فأنا مندهش من رؤية علامة "غير قادر على إعادة الإنتاج" على هذا الخطأ.

يبدو أنه سيكون هناك تحديث رئيسي قريبًا بسبب طلب السحب هذا: https://github.com/LearnBoost/socket.io-client/pull/343
cacois حاول استخدام socket.socket.reconnect () بدلاً من socket.reconnect ()

آه ، خبر رائع :-)

@ wackfordjf3 شكرا ، دعوة جيدة. يعمل الآن. :)

لا تزال تواجه مشكلات في إعادة الاتصال.
تؤدي إعادة الاتصال الثانية إلى إطلاق أحداث إعادة اتصال متعددة على الخادم. (وهذا يتضاعف مع كل إعادة اتصال لاحقة). أنا أطلق النار يعيد الاتصال على مساحة اسم.

المقبس = io.connect (عنوان url {'إعادة الاتصال': خطأ}) ؛ socket.disconnect ؛ // الفصل الأول
socket.socket.reconnect () ؛ socket.disconnect () ؛ // 2 قطع الاتصال
socket.socket.reconnect () ؛ // إعادة الاتصال الثاني

أنا على: المقبس. [email protected]

وبالإضافة إلى ذلك :
الطريقة القبيحة تعمل بشكل جيد:
حذف io.sockets [url] ؛ io.j = [] ؛
المقبس = io.connect (url) ؛

واجه نفس الشيء الذي واجهه الأشخاص هنا بالفعل ؛ حتى غريب في سيناريو مساحة الاسم. قم بإسقاط الحل الخاص بمسافة الأسماء:

var base = ' http: // localhost : 3000'
، channel = '/ chat'
، url = قاعدة + قناة ؛

var socket = io.connect (url) ؛

// call socket.disconnect () لن يتم قطع الاتصال ، لذلك:
io.sockets [قاعدة] .disconnect () ؛

// إعادة توصيل بناء الجملة.
حذف io.sockets [القاعدة] ؛ io.j = [] ،
المقبس = io.connect (url) ؛

ملاحظة: إصدار socket.io - 0.9.0 ، النظام الأساسي: windows 7 home premium

قضيت فترة ما بعد الظهيرة في مصارعة مع اختبارات الوحدة التي كانت مهلتها لأنني لم أستطع الاتصال بعد قطع الاتصال. {'فرض اتصال جديد': صحيح} حل المشكلة. شكرا @ ميلاني

نفس المشكلة هنا باستخدام Cucumber.js. نظرًا لأنني يجب أن أقوم بإنشاء كائنات وتدميرها ، فقد كنت أواجه نفس الاتصال وفصل الاتصال وفشل الاتصال. Thx ميلاني و rawberg

إنه يعمل بالنسبة لي! شكرا mrjoes.

شكرا @ ميلاني

يُطلق على إعداد "فرض اتصال جديد" اسم "forceNew" في إصدار v1.0 لأولئك الذين ربما واجهوا هذه المشكلة مرة أخرى.

لقد دفعت إلى الالتزام بإضافة BC مع ذلك ، لذلك قريبًا لا ينبغي لأحد أن يواجه هذه المشكلة بعد الآن!

عملت 4 لي ، socket = io.connect (socketUrl ، {'forceNew': true}) ؛

ForceNew يعطل نظام تعدد إرسال مساحة الاسم بالكامل ، فهل هذا هو الحل حقًا؟

أنا استخدم:
مقبس = io.connect ()
...
// هذه
socket.io.reconnect ()
..

Client.prototype.connect = function() {
    if (!this.connection) {
        this.connection = this.socket.connect(config.host + ':' + config.port);
    }
    else {
        if (!this.connection.connected) {
            this.connection.connect();
        }
    }
};

io.connect (null، {'force new connection': true})؛

هذا يحل مشكلتي ، شكرا لك السيد. ميلامي

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