2011-01-20 40 views
54

Cách gửi dữ liệu bổ sung tốt nhất khi kết nối socket?Gửi dữ liệu bổ sung về kết nối ổ cắm

Chủ đầu tư:

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

Node.js Server:

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

Ví dụ gửi một tên người dùng hoặc địa chỉ email vv

Trả lời

11

Các connection sự kiện bị sa thải ngay sau khi TCP kết nối được thiết lập. Không có cách nào để gửi bất cứ điều gì ở giữa.

Việc bạn có thể làm là chỉ cần gửi tin nhắn đầu tiên do máy chủ gửi và đưa dữ liệu vào tin nhắn đó. Tôi khuyên bạn nên cuộn một số giao thức mỏng cho điều này, vì vậy bạn sẽ có nhiều loại tin nhắn và sử dụng chúng để xác định cách mã sẽ xử lý dữ liệu.

Điều này cũng dễ mở rộng hơn, vì nó khá dễ dàng để tìm ra kiến ​​trúc chung cho điều đó. Nếu bạn muốn đợi userdata đến trước, bạn có thể chỉ cần thêm một số trạng thái vào kết nối của mình.

+0

Hey Ivo, Cảm ơn bạn rất nhiều cho việc trở lại với tôi. Bạn có thể cho tôi biết thêm chi tiết về cách đạt được những gì bạn đang nói không? Cảm ơn một lần nữa! – Dan

+0

Về cơ bản, tôi có một ứng dụng trò chuyện đang hoạt động, nơi bạn có thể gửi cho các khách hàng cụ thể. Vấn đề là tôi không có cách nào để kết hợp sessionId với tên người dùng. Vì vậy, nếu bạn và tôi đang trò chuyện, thay vì nói "Dan" và "Ivo" nó sẽ hiển thị id của khách hàng. – Dan

+0

Bạn có thể cho tôi biết thêm một chút thông tin về kiến ​​trúc/mã của bạn không? Các ID đến từ đâu và các tên đến từ đâu?Không thể ứng dụng không chỉ yêu cầu máy chủ và yêu cầu tên người dùng được liên kết với các ID? Tên người dùng –

4

này mã của tôi để gửi dữ liệu truy vấn để nodejs và máy chủ của khách hàng 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); 
}); 

truy vấn ... user1

01.
16

Tôi có một cách tiếp cận khác nhau - phát ra một sự kiện ngay sau khi kết nối, với các dữ liệu:

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

Bạn có thể giữ một biến/đối tượng, và nói, khi không có ehlo kiện với dữ liệu, các sự kiện khác bị bỏ qua cho đến khi ehlo được gửi.

Nếu điều này không đáp ứng, bạn có thể gửi dữ liệu ngay khi kết nối, tôi sẽ không sao chép mã nhưng nó là trong câu trả lời này: https://stackoverflow.com/a/13940399/1948292

+0

Đây là một cách tiếp cận tốt để truyền dữ liệu để xác định người dùng, như mã thông báo truy cập. Bạn cũng có thể muốn xử lý 'socket.on ('kết nối lại',…)' nếu máy chủ của bạn cần dữ liệu, nó có thể dừng lại sau khi ngắt kết nối. –

37

Bạn nên gửi dữ liệu của bạn, hoặc trong kết nối hoặc tạo:

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

với new version of socket.io, trên máy chủ là nơi mà mọi thứ đã được thay đổi:

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

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

Tôi đã thấy những người khác nói sử dụng 'socket.request.query', nhưng điều đó không làm việc cho tôi trên socket.io v1.7.2. Chắc chắn phải sử dụng 'socket.request._query'. – kellen

+0

Tại sao không có tài liệu về điều này? https://github.com/socketio/socket.io-client/blob/master/docs/API.md#iourl-options – rocketspacer

+1

Đối với socket.io v1.7.3, tôi phải sử dụng 'socket.handshake.query' (thông qua [câu trả lời này] (http://stackoverflow.com/questions/13745519/send-custom-data-along-with-handshakedata-in-socket-io)). –

Các vấn đề liên quan