Socket.io: Client.disconnect () لإجبار العميل على قطع الاتصال

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

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

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

يبدو أن socket.disconnect(); لا يعمل بشكل صحيح ، وبالتأكيد يؤدي إلى حدث قطع الاتصال ، لكنه لا يغلق الاتصال حرفيًا. هل هناك خلل أم أن هذا السلوك متوقع؟

ال 24 كومينتر

قد يكون من المثير للاهتمام مناقشة ما إذا كان الأمر يستحق التنفيذ (على الرغم من أنه سيكون ذا أولوية منخفضة). ومع ذلك ، فإن IRC kick / ban هو مثال على حيث لا يمكنني استخدام هذه الوظيفة. في هذه السيناريوهات ، من المرغوب فيه إبقاء العميل على اتصال ، ومنع بث رسائل قناة معينة فقط.

وجدت هذا عند التفكير في طريقة مماثلة.

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

شكرا!

سيكون هذا حقا مفيدا جدا.

هل client.connection.destroy () طريقة مشروعة لقطع اتصال العميل؟

زائد 1. أحب أن يكون لديك طريقة لفصل العميل بشكل نظيف. :)

client._onDisconnect () ، أو
socket.clients [kickedUserSocketId] ._ onDisconnect () ؛

يبدو أنه يفعل الحيلة.

ملاحظة: هناك شرطة سفلية قبل "onDisconnect" ، لكنها لا تظهر في هذا التخفيض.

رأيت أيضًا شخصًا يفعل ذلك مثل هذا (لم أختبره بنفسي على الرغم من ذلك):
socket.clients [kickedClientId] .send ({event: 'disconnect'})؛
socket.clients [kickedClientId] .connection.end () ؛

هل هذا مطبق الآن ، أم يجب أن أستخدم طريقة -

socket.clients [kickedClientId] .send ({event: 'disconnect'})؛
socket.clients [kickedClientId] .connection.end () ؛

ما هي الطريقة "الرسمية" لعمل هذا ؟؟؟؟

يرجى إعادة الفتح حتى نكتشف الطريقة الرسمية.

لا يوجد حتى الآن حل لهذا ، يرجى إعادة فتح لتتبع التقدم.

لقد اكتشفت للتو هذا الرمز في client / socket.js:

/**
 * Kicks client
 *
 * <strong i="6">@api</strong> public
 */

Socket.prototype.disconnect = function () {
  if (!this.disconnected) {
    this.log.info('booting client');

    if ('' === this.namespace.name) {
      if (this.manager.transports[this.id] && this.manager.transports[this.id].open) {
        this.manager.transports[this.id].onForcedDisconnect();
      } else {
        this.manager.onClientDisconnect(this.id);
        this.manager.store.publish('disconnect:' + this.id);
      }
    } else {
      this.packet({type: 'disconnect'});
      this.manager.onLeave(this.id, this.namespace.name);
      this.$emit('disconnect', 'booted');
    }

  }

  return this;
};

لقد جربته ( socket.disconnect() ) وهو يعمل بشكل جيد. يبدو أن هذا الرمز موجود منذ منتصف عام 2011 ولم يخبرنا أحد بذلك.

راجع أيضًا العدد رقم 795.

يبدو أن socket.disconnect(); لا يعمل بشكل صحيح ، وبالتأكيد يؤدي إلى حدث قطع الاتصال ، لكنه لا يغلق الاتصال حرفيًا. هل هناك خلل أم أن هذا السلوك متوقع؟

geniousphp @ أواجه نفس المشكلة

فلماذا تم إغلاق القضية ، هل تم حلها؟ إذا كان الأمر كذلك فكيف؟ ما هو الاستنتاج؟

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

محاولة،
socket.manager.onClientDisconnect (socket.id) ؛

أعتقد أن هذا ما أريده. مذهل.

للأسف acidhax طريقته لم تعد تعمل منذ الإصدار 1.0

هل هناك على أي حال أن الترقية 0.9.16 إلى 1.XX بسلاسة يا رفاق؟

+1

نفس القارب هنا. هذا مهم حقًا للاختبار حيث تريد عزل الاختبارات عن بعضها البعض.

    try {
        IO.Options opts = new IO.Options();
        opts.forceNew = true;
        opts.timeout = -1;
        socket1 = IO.socket(c.ip, opts);
        socket1.on("res", getdataListener);
        socket1.connect();
                socket1.on(com.github.nkzawa.socketio.client.Socket.EVENT_CONNECT,
                new Emitter.Listener() {

                    <strong i="5">@Override</strong>
                    public void call(Object... args) {

                        Logger.print("CONNECTED...............");

                        Message msg = new Message();
                        msg.what = ResponseCodes.CreateQueueResp;
                        Login.handler.sendMessage(msg);

                        activity.runOnUiThread(new Runnable() {

                            <strong i="6">@Override</strong>
                            public void run() {
                                // TODO Auto-generated method stub

                                startChecking();
                                startIdleChecking();

                            }

                        }); 
                    }

                })
                .on(com.github.nkzawa.socketio.client.Socket.EVENT_RECONNECT,
                        new Emitter.Listener() {

                            <strong i="7">@Override</strong>
                            public void call(Object... arg0) {


                                System.out
                                        .println("............... EVENT_RECONNECT");

                                // TODO Auto-generated method stub

                            }
                        })
                .on(com.github.nkzawa.socketio.client.Socket.EVENT_CONNECT_ERROR,
                        new Emitter.Listener() {

                            <strong i="8">@Override</strong>
                            public void call(Object... args) {

                                System.out
                                        .println("............... EVENT_CONNECT_ERROR");

                            }

                        })
                .on(com.github.nkzawa.socketio.client.Socket.EVENT_CONNECT_TIMEOUT,
                        new Emitter.Listener() {

                            <strong i="9">@Override</strong>
                            public void call(Object... args) {

                                System.out
                                        .println("............... EVENT_CONNECT_TIMEOUT");

                            }

                            // this is the emit from the server
                        })

                .on(Socket.EVENT_ERROR, new Emitter.Listener() {

                    <strong i="10">@Override</strong>
                    public void call(Object... args) {

                        System.out
                                .println("......................... EVENT_ERROR");

                    }

                    // this is the emit from the server

                })
                .on(com.github.nkzawa.socketio.client.Socket.EVENT_DISCONNECT,
                        new Emitter.Listener() {

                            <strong i="11">@Override</strong>
                            public void call(Object... args) {

                                Logger.print(".............EVENT_DISCONNECT");


                                if (!open) {

                                    //server_message = getResources().getString(R.string.It_seems_that);


                                    server_message="It seems that connection to server have been Lost.Please reconnect!"; 

                                    ServerError error = new ServerError(activity, server_message);


                                }

                            }

                        });

    } catch (Exception e) {

        e.printStackTrace();

    }

تم تشغيل تطبيق وظيفتي بشكل متكرر عندما يتلقى الجهاز الرسالة. في كل مرة يتم فتح اتصال مقبس التطبيق الوظيفي الخاص بي ، كيفية إغلاق الاتصال المفتوح بالقوة.
هذا هو منطق بلدي:
"استخدام صارم" ؛
var _test = يتطلب ('socket.io-client') ؛
var socket = _test.connect ('http://XXXXXXXXXX.net/') ؛
export.handler = function (event، Context) {
var ResultMessage = JSON.stringify (event.message، null، 2) ؛
إذا (! socket.connected)
{
socket.emit ("إضافة مستخدم"، "1542") ؛
}
socket.emit ('رسالة جديدة'، "[" + ResultMessage + "]")؛

} ؛
شكرا،
مقدما.

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