2014-02-23 43 views
8

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

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建立新的连接?

回答

8

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

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

socket.socket.options.query = 'i='+env.id; 
socket.socket.connect(); 
+0

如何传递两个参数与查询选项?提前致谢。! – Pritam

+0

尝试'socket.socket.options.query ='i ='+ env.id +'&j ='+ env.j;'。在它们之间放置一个&。 – Westy92

+0

我可能是错的,但我相信这个行为在v1.5破坏 – Aron

6

在当前版本socket.io的(在写的时刻是1.3.7),你应该使用

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

但是要小心使用这种由于this bug

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> 
+0

这个解决方案对我来说只是在重新连接时更新查询参数,查询参数没有更新,但Uri更改和查询更改它的工作原理。谢谢 – Achilles

+0

从2.0.3开始并不适用于我,我试过更改socket.io.opts.query,socket.query,socket.io.uri和socket.uri:/ –