Gửi tin nhắn đến một ID cụ thể trong Socket.IO 1.0


85

Tôi muốn gửi dữ liệu đến một ID ổ cắm cụ thể.

Chúng tôi đã từng có thể làm điều này trong các phiên bản cũ hơn:

io.sockets.socket(socketid).emit('message', 'for your eyes only');

Làm thế nào để tôi thực hiện một cái gì đó tương tự trong Socket.IO 1.0?

Câu trả lời:


206

Trong socket.io 1.0, họ cung cấp một cách tốt hơn cho việc này. Mỗi ổ cắm sẽ tự động tham gia vào một phòng mặc định theo id của chính mình. Kiểm tra tài liệu: http://socket.io/docs/rooms-and-namespaces/#default-room

Vì vậy, bạn có thể phát ra một socket bằng id với mã sau:

io.to(socketid).emit('message', 'for your eyes only');

Có sự khác biệt giữa to (room_id) và (user_socket_id)? Tôi thực sự sử dụng nó để gửi tin nhắn đến một phòng có thể có một hoặc nhiều người dùng. "Điều này giúp dễ dàng truyền thông báo đến các ổ cắm khác:", sau đó có thể là một hoặc nhiều, không phải là một tệp riêng tư duy nhất.
Washington Botelho

@WashingtonBotelho, các ID ổ cắm thường trông giống như "Uj5CRqZ5b_Xubx9sAAAA", vì vậy về lý thuyết có thể có nhiều người dùng trong phòng như vậy, nhưng trên thực tế, tôi không biết bất kỳ trường hợp nào khi tôi thêm một người dùng vào phòng cá nhân của người dùng khác.
Oleg

9
Làm thế nào chúng ta có thể xác định một người dùng cụ thể bằng socketId của họ, điều này có nghĩa là chúng ta cần lưu trữ một cặp giá trị khóa của người dùng (ví dụ: tên người dùng) và socketId ở đâu đó?
Sai

@Mustafa Dokumacı merhaba, bana bir yardim et stackoverflow.com/questions/38817680/...
Mahdi pishguy

Nó chỉ đơn giản như vậy ... tại sao không chỉ cung cấp cho chúng tôi một cách để gửi một tin nhắn đến một số id socket và thế là xong? Dù sao cũng được ủng hộ, công việc duy nhất xung quanh đó thực sự hoạt động trên 2.x
Adry

94

Trong socket.io 1.0, bạn có thể làm điều đó bằng mã sau:

if (io.sockets.connected[socketid]) {
    io.sockets.connected[socketid].emit('message', 'for your eyes only');
}

Cập nhật:

Câu trả lời của @ MustafaDokumacı chứa một giải pháp tốt hơn.


3
Sự khác biệt giữa câu trả lời này và câu trả lời tốt hơn được chỉ ra là với giải pháp NÀY, bạn có thể có các cuộc gọi lại rất hay. Nhưng với io.to (socketid), bạn KHÔNG THỂ sử dụng lệnh gọi lại.
Ramazan Polat

17

@Mustafa Dokumacı và @Curious đã cung cấp đủ thông tin, tôi đang thêm cách bạn có thể lấy id socket.

Để lấy id socket, hãy sử dụng socket.id :

var chat = io.of("/socket").on('connection',onSocketConnected);

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}

6

Nếu bạn đã sử dụng một không gian tên, tôi thấy rằng những điều sau đây hoạt động:

//Defining the namespace <br>
var nsp = io.of('/my-namespace');

//targeting the message to socket id <br>
nsp.to(socket id of the intended recipient).emit('private message', 'hello');

Thông tin thêm về không gian tên: http://socket.io/docs/rooms-and-namespaces/


5

Tôi tin rằng cả @Curious và @ MustafaDokumacı đều cung cấp các giải pháp hoạt động tốt. Tuy nhiên, sự khác biệt là với giải pháp của @ MustafaDokumacı, thông điệp được truyền đến một phòng chứ không chỉ cho một khách hàng cụ thể.

Sự khác biệt nổi bật khi yêu cầu xác nhận.

io.sockets.connected[socketid].emit('message', 'for your eyes only', function(data) {...});

hoạt động như mong đợi, trong khi

io.to(socketid).emit('message', 'for your eyes only', function(data) {...});

thất bại với

Error: Callbacks are not supported when broadcasting

1

trong Node.js -> socket.io -> có một ví dụ trò chuyện để tải xuống Dán đoạn này vào dòng (io trên kết nối) .. tôi sử dụng mã này hoạt động 100%

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    console.log(socket.id);
    io.to(socket.id).emit('chat message', msg+' you ID is:'+socket.id);
  });
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.