Отправить дополнительные данные о соединении сокетов
Как лучше отправлять дополнительные данные при подключении сокетов?
Клиент:
socket.on('connect',function(){
//I'd like set some values and pass them up to the node server.
});
Node.js Сервер:
io.on('connection', function(client){
//I'd like to get the data here.
});
Например, отправьте имя пользователя или адрес электронной почты и т.д.
Ответы
Ответ 1
Вы должны отправить свои данные либо в connect, либо при создании:
var s = io('http://216.157.91.131:8080/', { query: "foo=bar" });
s.connect();
var c = io.connect('http://216.157.91.131:8080/', { query: "foo=bar" });
С новой версией socket.io на сервере произошли изменения:
var io = require('socket.io')(server);
io.use(function(socket, next) {
var handshakeData = socket.request;
console.log("middleware:", handshakeData._query['foo']);
next();
});
Ответ 2
У меня другой подход - выпустите событие сразу после подключения, с данными:
socket.on('connect',function(){
// Send ehlo event right after connect:
socket.emit('ehlo', data);
});
io.on('connection', function(client){
// Receive ehlo event with data:
client.on('ehlo', function(data) {
});
});
Вы можете сохранить переменную/объект и сказать, что при отсутствии события ehlo
с данными другие события игнорируются до тех пор, пока не будет отправлено сообщение ehlo
.
Если это не удовлетворяет, вы можете отправлять данные прямо при подключении, я не буду копировать код, но он находится в этом ответе: fooobar.com/questions/102173/...
Ответ 3
События connection
запускаются, как только устанавливается соединение TCP. Нет никакого способа отправить что-либо между ними.
Что вы можете сделать, так это просто перенести первое сообщение на сервер и поместить данные в это сообщение. Я бы настоятельно рекомендовал перевести тонкий протокол для этого, поэтому у вас будет несколько типов сообщений и используйте их для определения того, как код должен обрабатывать данные.
Это было бы более расширяемым, так как для этого достаточно просто создать общую архитектуру. Если вы хотите дождаться появления userdata
, вы можете просто добавить какое-то состояние в свои соединения.
Ответ 4
Я нашел ответ, который здесь очень полезен: Отправить пользовательские данные вместе с handshakeData в socket.io?
Также очистка в следующей документации помогает объяснить способы привязки переменных к объекту рукопожатия, к которым можно получить доступ из объекта сокета во время соединения: https://github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization
Ответ 5
этот мой код для отправки данных запроса узлам и серверу server.io server
var socket = io.connect(window.location.origin,{query:'loggeduser=user1'});
io.sockets.on('connection', function (socket) {
var endp = socket.manager.handshaken[socket.id].address;
console.log("query... " + socket.manager.handshaken[socket.id].query.user);
});
запрос... user1