2011-01-20 6 views
54

소켓 연결시 추가 데이터를 보내는 가장 좋은 방법은 무엇입니까?소켓 연결시 추가 데이터 보내기

클라이언트 :

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

답변

11

사용자 이름이나 이메일 주소를 보내는 connection 이벤트가 TCP 즉시 해고 연결이 설정됩니다. 그 사이에 어떤 것도 보낼 수있는 방법이 없습니다.

당신이 할 수있는 일은 단순히 서버가 보내는 첫 번째 메시지를 가져 와서 그 메시지에 데이터를 넣는 것입니다. 나는 이것에 대한 약간의 프로토콜을 롤백 할 것을 강력히 제안한다. 따라서 여러 유형의 메시지를 가지고이를 사용하여 코드가 데이터를 처리하는 방법을 결정한다.

일반 아키텍처를 사용하기가 비교적 쉽기 때문에 확장 가능합니다. userdata이 먼저 오기를 기다리려면 연결에 상태를 추가하면됩니다.

+0

헤이 이보, 덕분에 나에게 다시 얻기를위한 많은. 당신이 말하는 것을 성취하는 방법에 대해 좀 더 자세히 설명해 주시겠습니까? 다시 한 번 감사드립니다! – Dan

+0

기본적으로, 나는 특정 고객에게 보낼 수있는 일하는 채팅 앱이 있습니다. 문제는 sessionId와 사용자 이름을 일치시킬 방법이 없다는 것입니다. 그래서 당신과 내가 채팅 중이라면 "Dan"과 "Ivo"라고 말하면서 클라이언트 아이디를 보여줄 것입니다. – Dan

+0

아키텍처/코드에 대한 정보를 좀 더 알려 줄 수 있습니까? ID는 어디에서 왔으며 이름은 어디에서 유래 되었습니까?앱이 서버에 대한 요청을하지 않고 ID와 연결된 사용자 이름을 요청할 수 없습니까? –

4

nodejs 및 server.io 서버 클라이언트

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

쿼리에 쿼리 데이터를 전송하는이 내 코드 ... 사용자 1

데이터를 더 ehlo 이벤트는 다른 이벤트가 없을 때 당신은 변수/객체를 보유하고 말할 수

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

: 데이터와 바로 연결 한 후 이벤트를 방출 - 16,

16

나는 다른 접근 방식을 가지고 ehlo이 전송 될 때까지 무시됩니다. 이 만족하지 않는 경우

, 연결할 때 내가 코드를 복사하지 않습니다, 바로 데이터를 전송할 수 있지만이 답변에 있습니다 https://stackoverflow.com/a/13940399/1948292

+0

이것은 액세스 토큰과 같은 사용자를 식별하기 위해 데이터를 전달하는 좋은 방법입니다. 연결 해제 후에도 서버가 데이터를 필요로한다면 지속을 멈추게 할 수도있는'socket.on ('reconnect', ...)'를 처리 할 수도있다. –

37
당신이 중 하나를 만들에 연결 또는 데이터를 전송해야

:

new version of socket.io
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" }); 

은 서버에 일을 변경 한 곳이다 :

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

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

다른 사람들이'socket.request.query'를 사용하는 것을 보았습니다 만, socket.io v1.7.2에서는 저것이 작동하지 않습니다. 확실히'socket.request._query'를 사용해야합니다. – kellen

+0

왜 이것에 대한 문서가 없습니까? https://github.com/socketio/socket.io-client/blob/master/docs/API.md#iourl-options – rocketspacer

+1

socket.io v1.7.3에서는'socket.handshake.query'를 사용해야했습니다. ([이 답변] (http://stackoverflow.com/questions/13745519/send-custom-data-along-with-handshakedata-in-socket-io)을 통해). –