Socket.io: الطريقة الصحيحة للعميل لإعادة الاتصال بعد أن يقوم الخادم بعمل مأخذ. قطع الاتصال (صحيح)

تم إنشاؤها على ٩ مارس ٢٠١٦  ·  35تعليقات  ·  مصدر: socketio/socket.io

الخادم : node + socket.io

var io = require( 'socket.io' )( 3000 );

io.on( 'connection', function ( socket ) ...

// at some point if client auth fails, server may kick him out:

socket.disconnect( true );

العميل : html / js + socket.io 1.4.5

socket = io.connect( 'http://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: 99999
} );

socket.on( 'connect', function () {
    console.log( 'connected to server' );
} );

socket.on( 'disconnect', function () {
    console.log( 'disconnected to server' );
} );

ما ورد أعلاه مبسط ولكن هذا هو الأساس. تعمل إعادة الاتصال بشكل جيد إذا قمت بتشغيل العميل عندما يكون الخادم معطلاً. يحاول العميل الاتصال بالخادم وعندما أقوم بتشغيل الخادم أخيرًا ، يتم تثبيت الاتصال.

في مرحلة ما ، قد يحدث أن يقرر الخادم قطع اتصال العميل ، ويرجع ذلك أساسًا إلى أنه قام بتسجيل الخروج لإبطال الرمز المميز وطلب الاستعلام الموجود على db القيام بذلك ، أو انتهاء صلاحية رمز المصادقة أو أي شيء آخر.

في هذه الحالة ، أرغب في استعادة استقصاء الخادم من قبل العميل لأن المستخدم قد يرغب في تسجيل الدخول مرة أخرى ولديه حقوق الاتصال مرة أخرى بالخادم.

إذا قمت بتحديث الصفحة (العميل) في المتصفح ، فستعمل بشكل جيد ولكنها حل قبيح.

أعتقد أن السبب هو تعيين خاصية "Manager.skipReconnect" على "true" بعد إجراء قطع الاتصال () ، لذلك أسأل ما هي الطريقة الصحيحة لإعادة بدء استقصاء إعادة الاتصال بواسطة العميل بعد أن يقوم الخادم بفصل العميل.

تم العثور على بعض الإجابات على stackoverflow حول هذا ولكن جميعها لم تنجح ، كل الأشياء التي سيتم تنفيذها في العميل:

  • socket.io.reconnect () ؛
  • socket.socket.reconnect () ؛ // ؟؟
  • socket = io.connect (' http://127.0.0.1 : 3000' ، ... // يبدو أن إعادة استدعاء مقتطف الاتصال فكرة سيئة

هل يمكنك مساعدتي في هذا الأمر؟

شكرا لك

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

في الوقت الحالي ، تمكنت بهذه الطريقة ويبدو أنها مستقرة:

العميل :

var app = {
...
socket: null,
connect: function() {
  var self = this;
  if( self.socket ) {
    self.socket.destroy();
    delete self.socket;
    self.socket = null;
  }
  this.socket = io.connect( 'http://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );
  this.socket.on( 'connect', function () {
    console.log( 'connected to server' );
  } );
  this.socket.on( 'disconnect', function () {
    console.log( 'disconnected from server' );
    window.setTimeout( 'app.connect()', 5000 );
  } );
}
...
} // var app

ال 35 كومينتر

في الوقت الحالي ، تمكنت بهذه الطريقة ويبدو أنها مستقرة:

العميل :

var app = {
...
socket: null,
connect: function() {
  var self = this;
  if( self.socket ) {
    self.socket.destroy();
    delete self.socket;
    self.socket = null;
  }
  this.socket = io.connect( 'http://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );
  this.socket.on( 'connect', function () {
    console.log( 'connected to server' );
  } );
  this.socket.on( 'disconnect', function () {
    console.log( 'disconnected from server' );
    window.setTimeout( 'app.connect()', 5000 );
  } );
}
...
} // var app

باستخدام نهج مشابه لـ:

  this.socket = io.connect( 'ws://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );

لسوء الحظ ، يتسبب هذا في استخدام المقبس لبروتوكول http ، بدلاً من مآخذ الويب.

لا تزال تبحث عن نهج جيد لاتصال دائم بمقبس الويب.

هل فاتني شيء ؟؟؟

مهتم أيضًا بإيجاد حل لهذا.

socket.connect()
عملت بالنسبة لي على الإصدار 1.5.1. امل ان يساعد.

sconway هل يمكنك أن

أهلا،

كان لديه نفس السؤال ، ووجد أن هذا الحل ، الذي يتم اختباره حاليًا ، يبدو أنه إما حل قوي أو حل بديل قوي ... (كلاهما متوفر)

http://stackoverflow.com/questions/10437584/socket-io-reconnect

هل يمكننا إصلاح هذا في socket.io نفسه؟

قمت بالترقية إلى الإصدار 2.0.3 وعملت إعدادات الاتصال التلقائي الافتراضية الخاصة به ، ولا توجد مشكلات هنا.

عندما يقوم الخادم أو العميل باستدعاء طريقة قطع الاتصال () يقوم العميل بتدمير المقبس ، ويحذف كافة معالجات الأحداث ويقوم المدير بإزالته من الصفيف المتصل. لن يحدث هذا عندما يكون انقطاع الاتصال لسبب آخر.
يمكن قراءة حل رائع للمعلمة السبب
.on('disconnect', reason => { if(reason === 'io server disconnect') { //you should renew token or do another important things before reconnecting socket.connect(); } });
أو تحقق بشكل أفضل مما إذا كان المقبس لا يزال في قائمة الاتصال الخاصة بالمدير
.on('disconnect', () => { if(socket.io.connecting.indexOf(socket) === -1){ //you should renew token or do another important things before reconnecting socket.connect(); } })

لقد فعلت ذلك مثل DrLightman وهو يعمل بشكل مثالي!

var WebSocketServer = {
    isConnected: false,
    socket: null,
    interval: null,
    connect() {
        if (this.socket) {
            this.socket.destroy();
            delete this.socket;
            this.socket = null;
        }
        this.socket = io.connect('http://localhost:9010', {
            reconnection: false
        });
        this.socket.on('connect', () => {
            this.isConnected = true;
            this.socket.emit('authentication', { user_id: 2751, token: "abc" });
            this.socket.on('authenticated', function() {

            });
        });

        this.socket.on('disconnect', () => {
            this.isConnected = false;
            this.interval = window.setInterval(() => {
                if (this.isConnected) {
                    clearInterval(this.interval);
                    this.interval = null;
                    return;
                }
                WebSocketServer.connect()
            }, 5000);
        });

        return this.socket;
    }
}

var socket = WebSocketServer.connect();

DrLightman هذه هي الطريقة التي
var io= new socketio.connect('http://192.168.43.79:3000',{'forceNew':true});

pablodgonzalez لدي نفس السؤال ، هل

programmerCs نعم ، إنه كذلك. في الإنتاج دون الكشف عن المشاكل.

هذه القضية أزال الكثير من مشاكلي
شكرا لكم جميعا

واجهت نفس المشكلة عندما أردت إجبار العميل على تحديث رمزه المميز لأنه انتهى أثناء الاتصال بالخادم.

انتهى بي الأمر بإرسال حدث إلى العميل بدلاً من ذلك ، وأطلب منه تحديث رمزه المميز. لا يتم إغلاق أي مقبس من خلال القيام بذلك ، لذلك فهو يتجنب المشاكل ويعمل بشكل جيد!

... حان الوقت الآن لدفع ذلك إلى الإنتاج! : cold_sweat:: smirk:

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

qassa إذا كنت بحاجة إلى بعض التأكيد حول معامل رد الاتصال. بدلاً من ذلك ، إذا كنت بحاجة إلى ضمان استقبال حدث ما ، فلا يجب عليك استخدام socket.io ولكن بعض مكتبة / بروتوكول قائمة الانتظار مثل البعوض / mqtt أو أيًا كان.
يعد setTimeout خيارًا ولكن المقبس المنفصل (بواسطة الخادم أو العميل) هو مأخذ تم إتلافه قريبًا. لذا ، إذا كنت بحاجة إلى ضمان إعادة اتصال سهلة وسريعة ، فلماذا تستخدم setTimeout إذا كان لديك مثيل كائن مأخذ التوصيل حتى الآن ويمكنك استدعاء connect ()؟

يحتاج شخص من المشروع إلى توثيق هذا ...

Lemme يصحح الأمر ، هل يقوم الخادم بفصل العميل لسبب معين أو بسبب فقدان الاتصال بالشبكة؟ إذا كانت الشبكة فقط ، فسيحاول Socketio (العميل) إعادة الاتصال إلى أجل غير مسمى! ، إذا تم تكوينه على هذا النحو io=new socketio(‘http://yourserver.com’, {'forceNew':true}); كلتا الحالتين ، فسيستمر في إعادة الاتصال ، ولكن إذا وضعت listerner لقطع الاتصال بالخادم ، فاتصل ببساطة بـ io.disconnect() على العميل

من: CxRes [mailto: [email protected]]
تاريخ الإرسال: 01 فبراير 2018 الساعة 09:50 مساءً
إلى: socketio / socket.io [email protected]
نسخة إلى: devyaz [email protected] ؛ التعليق [email protected]
الموضوع: Re: [socketio / socket.io] الطريقة الصحيحة للعميل لإعادة الاتصال بعد أن يقوم الخادم بعمل مأخذ. قطع الاتصال (صحيح) (# 2476)

يحتاج شخص من المشروع إلى توثيق هذا ...

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/socketio/socket.io/issues/2476#issuecomment-362381171 ، أو كتم صوت السلسلة https://github.com/notifications/unsubscribe-auth/ ATfQSQQ1LJ90E6FqsdmiMktpp2AdoLuxks5tQhVQgaJpZM4HsVs7 . https://github.com/notifications/beacon/ATfQSYqwkgtrHZk9FASNZUl69ps9ZYYCks5tQhVQgaJpZM4HsVs7.gif

devyaz أحبك

تم تحديث الوثائق بإجابةpablodgonzalez : https://github.com/socketio/socket.io-client/commit/afb952d854e1d8728ce07b7c3a9f0dee2a61ef4e

شكرا جزيلا!

استخدم الإصدار 0.8.3 من io.socket إزالة الإصدار الجديد 1.0.0

compile('io.socket:socket.io-client:0.8.3') {
    exclude group: 'org.json', module: 'json'
}

باستخدام نهج مشابه لـ:

  this.socket = io.connect( 'ws://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );

لسوء الحظ ، يتسبب هذا في استخدام المقبس لبروتوكول http ، بدلاً من مآخذ الويب.

لا تزال تبحث عن نهج جيد لاتصال دائم بمقبس الويب.

هل فاتني شيء ؟؟؟

استخدم wss: //

باستخدام نهج مشابه لـ:

  this.socket = io.connect( 'ws://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );

لسوء الحظ ، يتسبب هذا في استخدام المقبس لبروتوكول http ، بدلاً من مآخذ الويب.
لا تزال تبحث عن نهج جيد لاتصال دائم بمقبس الويب.
هل فاتني شيء ؟؟؟

استخدم wss: //

مرحبًا ، bro.how يمكن أن يكون أنه إذا كنت تستخدم wss.it فقط للعمل كاتصال دائم بمقبس الويب ، فلديك نفس السؤال حول مجرد الاحتفاظ وإعادة الشبكة بسرعة مع عدم إجراء الاستقصاء.

عندما يقوم الخادم أو العميل باستدعاء طريقة قطع الاتصال () يقوم العميل بتدمير المقبس ، ويحذف كافة معالجات الأحداث ويقوم المدير بإزالته من الصفيف المتصل. لن يحدث هذا عندما يكون انقطاع الاتصال لسبب آخر.
يمكن قراءة حل رائع للمعلمة السبب

.on('disconnect', reason => { 
  if(reason === 'io server disconnect') {
    //you should renew token or do another important things before reconnecting
    socket.connect();
  }
});

أو تحقق بشكل أفضل مما إذا كان المقبس لا يزال في قائمة الاتصال الخاصة بالمدير

.on('disconnect',  () => {
  if(socket.io.connecting.indexOf(socket) === -1){
    //you should renew token or do another important things before reconnecting
    socket.connect();
  }
})

هل يمكنك توضيح السبب وراء أنه من الأفضل التحقق مما إذا كان المقبس لا يزال في قائمة اتصال المدير؟ أخذ المستند المحدث الحل الأول فقط وهو التحقق من سبب قطع الاتصال. شكرا.

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

أنا غير قادر على مقبس قطع الاتصال في التطبيق الأيوني. لدي socket.on في مُنشئ الصفحة المشتركة في الموفرين. أريد فصل المقبس إلى وظيفة في نفس الملف حيث يتم استدعاء تسجيل الخروج من التطبيق.

لكنني قادر على فصل المقبس. أنا متعدد socket.on ("الحدث") على عدة انبعاث في التطبيق.
يمكن لأي شخص مساعدتي؟

يجب أن يقوم Socket.donnect () بفعله

في الإثنين ، 11 نوفمبر 2019 06:16 krunal9421 ، كتب [email protected] :

أنا غير قادر على مقبس قطع الاتصال في التطبيق الأيوني. أملك
socket.on في مُنشئ الصفحة المشتركة في الموفرين. أريد أن
افصل المقبس في وظيفة في نفس الملف من حيث التطبيق
يسمى تسجيل الخروج.

لكنني قادر على فصل المقبس. أنا متعدد المقبس على ("الحدث")
على انبعاث متعددة في التطبيق.
يمكن لأي شخص مساعدتي؟

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/socketio/socket.io/issues/2476؟
أو إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/AE35ASJPORGOSYQAEJEHHG3QTDMC7ANCNFSM4B5RLM5Q
.

devyaz أنا غير قادر على فصل المقبس باستخدام socket.disconnect ().
لقد شاركت نموذج الكود الخاص بي مع هذا.
https://i.stack.imgur.com/wrIEv.png.

لقد كتبت التعليمات البرمجية في ملف مشترك.

هل تحاول قطع الاتصال بالخادم أو جانب المستخدم؟ أي يجب أن الخادم
قطع اتصال المستخدم. لأنه إذا فقد الخادم العميل ، فإنه يتسبب في قطع الاتصال
حدث. ولكن يمكن للعميل قطع الاتصال بالخادم عن طريق الاتصال
socket.disconnect

في الأربعاء ، 20 نوفمبر 2019 05:39 krunal9421 ، كتب [email protected] :

devyaz https://github.com/devyaz لا يمكنني فصل المقبس
باستخدام المقبس. قطع الاتصال ().
لقد شاركت نموذج الكود الخاص بي مع هذا.
https://i.stack.imgur.com/wrIEv.png.

لقد كتبت التعليمات البرمجية في ملف مشترك.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/socketio/socket.io/issues/2476؟email_source=notifications&email_token=AE35ASK4NY4SKG5JWSBDKCTQUSWNVA5CNFSM4B5RLM52YY3PNVWWK3TUL52HS4DFVREXG43VMVBW21
أو إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/AE35ASIFTISGTIAQQ7UKCJDQUSWNVANCNFSM4B5RLM5Q
.

باستخدام هذا من جانب العميل.

افعل this.socketstatus.disconnect() في وظيفة تسجيل الخروج وأعتقد
يجب عليك إزالة الوظيفة ".on (" متصل "، .....)"

في الجمعة ، 22 نوفمبر 2019 11:50 krunal9421 ، كتب [email protected] :

باستخدام هذا من جانب العميل.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/socketio/socket.io/issues/2476؟email_source=notifications&email_token=AE35ASJTREAYRMF4THBK3FDQU6TOLA5CNFSM4B5RLM52YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LN
أو إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/AE35ASJGKVGVUQNK454C63DQU6TOLANCNFSM4B5RLM5Q
.

بعد فقد الاتصال ، يعيد المقبس الاتصال بالخادم. بعد ذلك ، يستمر في إظهار _io.socket.engineio.client.EngineIOException: xhr post error_ in Android .
معظم الإجابات من StackOverflow لا تعمل.
أنا عالق في هذه المشكلة T_T .... ساعدني من فضلك!

أحاول تنفيذ هذا الرمز في node.js + javaScript wepapp ولكن عندما يكون متصفح هاتفي في الخلفية ، في علامة تبويب غير نشطة أو شاشة مقفلة ، يتم فصله بعد بضع دقائق.

حاولت إعادة الاتصال بمقبس عند فصله (مع استجابات ping timeout أو transport closed ) لكن ذلك مستحيل. هل هذا سلوك طبيعي على متصفحات الهاتف؟ لأنه في أجهزة الكمبيوتر المحمول أو متصفحات سطح المكتب تعمل كما هو متوقع.

هل يستطيع أي أحد مساعدتي؟

شكرا

مرحبًا asiermusa ولكن في الويب ، يجب عليك استخدام عامل ويب لتجنب تعليق العملية. أنا بصدق لا أعرف ما إذا كان ذلك كافياً لتحقيق ذلك.

في صحتك!

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