2011-01-20 16 views
54

Jak najlepiej wysyłać dodatkowe dane po połączeniu z gniazdem?Wysyłaj dodatkowe dane dotyczące połączenia z gniazdem

Klient:

socket.on('connect',function(){ 
//I'd like set some values and pass them up to the node server. 
}); 

node.js Serwer:

io.on('connection', function(client){ 
//I'd like to get the data here. 
}); 

Na przykład wysyłając nazwę użytkownika lub adres e-mail itd

Odpowiedz

11

Zdarzenia connection wylecieć najszybciej jak TCP połączenie zostało ustanowione. Nie ma sposobu, aby wysłać coś pomiędzy.

To, co możesz zrobić, to po prostu wziąć pierwszą wiadomość wysłaną przez serwer i umieścić dane w tej wiadomości. Zdecydowanie sugerowałbym wprowadzenie do tego celu cienkiego protokołu, aby mieć wiele rodzajów wiadomości i używać ich do określenia, w jaki sposób kod powinien przetwarzać dane.

Byłoby to również łatwiejsze do rozbudowy, ponieważ dość łatwo jest stworzyć ogólną architekturę. Jeśli chcesz najpierw poczekać na userdata, możesz po prostu dodać jakiś stan do swoich połączeń.

+0

Ivo Hej, dzięki za wraca do mnie. Czy możesz podać mi więcej szczegółów na temat tego, jak osiągnąć to, co mówisz? Dzięki jeszcze raz! – Dan

+0

Zasadniczo mam działającą aplikację do czatu, na której możesz wysyłać wiadomości do określonych klientów. Problem polega na tym, że nie mam możliwości dopasowania adresu sessionId do nazwy użytkownika. Tak więc, jeśli ty i ja rozmawialiśmy, zamiast mówić "Dan" i "Ivo", pokazywałoby to identyfikator klienta. – Dan

+0

Czy możesz podać mi więcej informacji o swojej architekturze/kodzie? Skąd pochodzą identyfikatory i skąd pochodzą nazwy?Czy aplikacja nie może po prostu wysłać żądania do serwera i poprosić o nazwy użytkowników powiązane z identyfikatorami? –

4

to mój kod do wysyłania danych kwerendy do nodejs i server.io klienta serwera

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); 
}); 

zapytań ... user1

16

mam inne podejście - emitują zdarzenia zaraz po podłączeniu, z danymi:

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) { 
    }); 
}); 

można trzymać zmienny/przedmiot, i powiedzmy, gdy nie ma ehlo wydarzenie z danymi, inne wydarzenia są ignorowane do momentu wysłania ehlo.

Jeśli nie spełnia, można wysyłać dane tuż przy łączeniu, nie będę skopiować kod, ale to jest w tej odpowiedzi: https://stackoverflow.com/a/13940399/1948292

+0

Jest to dobre podejście do przekazywania danych w celu identyfikacji użytkownika, takie jak token dostępu. Możesz także chcieć obsłużyć 'socket.on ('reconnect', ...)' jeśli twój serwer potrzebuje danych, które mogą przestać się utrzymywać po rozłączeniu. –

37

należy wysłać swoje dane albo w connect lub utworzyć:

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" }); 

z new version of socket.io na serwerze, gdzie te rzeczy zostały zmienione:

var io = require('socket.io')(server); 

io.use(function(socket, next) { 
    var handshakeData = socket.request; 
    console.log("middleware:", handshakeData._query['foo']); 
    next(); 
}); 
+0

Widziałem, jak inni mówią, że używają 'socket.request.query', ale to nie działa dla mnie na socket.io v1.7.2. Zdecydowanie trzeba użyć 'socket.request._query'. – kellen

+0

Dlaczego nie ma na ten temat dokumentacji? https://github.com/socketio/socket.io-client/blob/master/docs/API.md#iourl-options – rocketspacer

+1

Dla socket.io v1.7.3, musiałem użyć 'socket.handshake.query' (przez [tę odpowiedź] (http://stackoverflow.com/questions/13745519/send-custom-data-along-with-handshakedata-in-socket-io)). –

Powiązane problemy