14

当他通过socket.io连接时,我传递了一个包含ID的自定义查询字符串来授权服务器上的客户端。

var env = {id:12345};
var socket = io.connect('https://example.com', {query:'i='+env.id, port:443, reconnect:false, secure:true});  

当客户端因任何原因断开连接时,只需调用以下函数即可重新连接。

socket.socket.connect();

但是,在重新连接时env.id通常包含与初始连接期间不同的值,并且我希望在每次重新连接时在查询字符串中具有当前值。

上述重新连接方法再次发送初始值,即使env.id同时更改为其他值。

我尝试在调用重新连接函数时设置当前参数,但这似乎不起作用。

socket.socket.connect('https://example.com', {query:'i='+env.id, port:443, reconnect:false, secure:true})  

有没有一种简单的方法可以用当前env.id值更新查询字符串然后重新连接?

var socket = io.connect()或者我是否需要在断开连接后销毁整个套接字对象,然后使用当前 ID建立一个新连接?

4

5 回答 5

12

我分析了套接字对象并找到了解决方案,因此我正在回答我自己的问题。

查询字符串存储在socket.socket.options.query. 您可以在重新连接之前直接将其更改为所需的值。

socket.socket.options.query = 'i='+env.id;
socket.socket.connect();
于 2014-02-24T23:16:04.423 回答
11

在当前版本的 socket.io 中(在撰写本文时为 1.3.7),您应该使用

socket.io.opts.query = 'i='+env.id;

但是由于这个错误,请小心使用它

于 2015-11-18T14:38:55.920 回答
2

使用 socket.io 版本 1.4.8 ,我尝试了很多事情来让它工作,最终对我有用的是在调用 connect() 重新连接之前设置 socket.io.uri 和 socket.io.opts.query

// Original connection
socket = io.connect('https://socket.example.com/?token=' + data.socket_auth_token, {
                            reconnection: false,
                            transports: ['websocket', 'polling'],
                            'sync disconnect on unload': true
                  });

// Reconnect

socket.io.uri = 'https://socket.example.com/?token=' + data.socket_auth_token; 
socket.io.opts.query = 'token=' + data.socket_auth_token;
socket.connect();

这里有更多的上下文代码:

 <script src="//js/contrib/socket.io.js"></script>
    <script>

        socket = io.connect('https://socket.example.com/?token=' + data.socket_auth_token {
            reconnection: false,
            transports: ['websocket', 'polling'],
            'sync disconnect on unload': true
        });

        function reconnectSocket() {
            if (typeof socket != 'undefined' && !socket.connected) {
                $.ajax({
                    url: '/api/socket/',
                    type: 'POST',
                    data: {
                        'action': 'generate_token',
                    },
                    dataType: 'json'
                }).done(function (data) {
                    socket.io.uri = 'https://socket.example.com/?token=' + data.socket_auth_token;
                    socket.io.opts.query = 'token=' + data.socket_auth_token;
                    socket.connect();
                });
            }
            setTimeout(reconnectSocket, 5000);
        }
        setTimeout(reconnectSocket, 5000);
    </script>
于 2017-01-19T00:29:20.973 回答
0

对于 v2.1.1,我通过在更改查询参数后断开连接并重新连接来解决这个问题:

socket.socket.query = { ...updated queries here}
socket.socket.disconnect().connect()
于 2021-06-01T13:30:00.673 回答
-1

你可以像这样使用反射:

        Field field = Manager.class.getDeclaredField("opts");
        field.setAccessible(true);
        Manager.Options options = (Manager.Options) field.get(socket.io());
        options.query = getQuery();
于 2019-07-08T02:57:19.480 回答