Обновить параметр строки запроса в socket.io reconnect
Я передаю пользовательскую строку запроса, содержащую идентификатор, для авторизации клиента на сервере, когда он подключается через 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()
с текущим идентификатором?
Ответы
Ответ 1
Я проанализировал объект сокета и нашел решение, поэтому я отвечаю на свой вопрос.
Строка запроса сохраняется внутри socket.socket.options.query
. Вы можете изменить его до желаемого значения непосредственно перед повторным подключением.
socket.socket.options.query = 'i='+env.id;
socket.socket.connect();
Ответ 2
В текущей версии socket.io(на момент написания 1.3.7) вы должны использовать
socket.io.opts.query = 'i='+env.id;
Но будьте осторожны при использовании этого этой ошибки
Ответ 3
Используя версию socket.io 1.4.8, я попробовал кучу вещей, чтобы заставить это работать, что в конечном итоге сработало для меня, было установить как socket.io.uri, так и socket.io.opts.query перед вызовом connect ( ) для повторного подключения
// 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>
Ответ 4
Вы можете использовать отражение следующим образом:
Field field = Manager.class.getDeclaredField("opts");
field.setAccessible(true);
Manager.Options options = (Manager.Options) field.get(socket.io());
options.query = getQuery();