2014-02-23 57 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:/ –