Socket.io: Client.disconnect() 强制客户端断开连接

创建于 2010-09-08  ·  24评论  ·  资料来源: socketio/socket.io

在 Client 实例上有一个 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 = require('socket.io-client');
var socket = _test.connect('http://XXXXXXXXXX.net/');
export.handler = 函数(事件,上下文){
var ResultMessage = JSON.stringify(event.message,null,2);
如果(!socket.connected)
{
socket.emit('添加用户', '1542');
}
socket.emit('新消息',"[" + ResultMessage + "]");

};
谢谢,
提前。

此页面是否有帮助?
0 / 5 - 0 等级