我正在使用插座。io和node.js,到目前为止,它似乎很好,但我不知道如何从服务器发送消息到特定的客户端,就像这样:

client.send(message, receiverSessionId)

但是.send()和.broadcast()方法似乎都不能满足我的需要。

我发现了一个可能的解决方案,是.broadcast()方法接受作为第二个参数的sessionid数组,不发送消息,所以我可以传递一个数组与所有的sessionid连接到服务器,除了一个我希望发送消息,但我觉得必须有一个更好的解决方案。

什么好主意吗?


当前回答

你可以这样做

在服务器上。

global.io=require("socket.io")(server);

io.on("connection",function(client){
    console.log("client is ",client.id);
    //This is handle by current connected client 
    client.emit('messages',{hello:'world'})
    //This is handle by every client
    io.sockets.emit("data",{data:"This is handle by every client"})
    app1.saveSession(client.id)

    client.on("disconnect",function(){
        app1.deleteSession(client.id)
        console.log("client disconnected",client.id);
    })

})

    //And this is handle by particular client 
    var socketId=req.query.id
    if(io.sockets.connected[socketId]!=null) {
        io.sockets.connected[socketId].emit('particular User', {data: "Event response by particular user "});
    }

在客户端,它很容易处理。

var socket=io.connect("http://localhost:8080/")
    socket.on("messages",function(data){
        console.log("message is ",data);
        //alert(data)
    })
    socket.on("data",function(data){
        console.log("data is ",data);
        //alert(data)
    })

    socket.on("particular User",function(data){
        console.log("data from server ",data);
        //alert(data)
    })

其他回答

不管我们使用的是什么版本,如果我们只是console.log()我们在服务器端nodejs代码中使用的“io”对象,[例如io. log]在('connection', function(socket){…});]上,我们可以看到"io"只是一个json对象,有许多子对象存储套接字id和套接字对象。

我正在使用socket。顺便说一句,IO版本1.3.5。

如果我们查看io对象,它包含,

 sockets:
  { name: '/',
    server: [Circular],
    sockets: [ [Object], [Object] ],
    connected:
     { B5AC9w0sYmOGWe4fAAAA: [Object],
       'hWzf97fmU-TIwwzWAAAB': [Object] },

在这里我们可以看到套接字“B5AC9w0sYmOGWe4fAAAA”等。所以,我们可以,

io.sockets.connected[socketid].emit();

再进一步观察,我们可以看到这样的片段,

 eio:
  { clients:
     { B5AC9w0sYmOGWe4fAAAA: [Object],
       'hWzf97fmU-TIwwzWAAAB': [Object] },

我们可以从这里通过

io.eio.clients[socketid].emit();

在引擎下,

engine:
 { clients:
    { B5AC9w0sYmOGWe4fAAAA: [Object],
      'hWzf97fmU-TIwwzWAAAB': [Object] },

所以,我们也可以这样写,

io.engine.clients[socketid].emit();

所以,我想我们可以用上面列出的三种方法中的任何一种来实现我们的目标,

io.sockets.connected [socketid] .emit (); 或 io.eio.clients [socketid] .emit (); 或 io.engine.clients [socketid] .emit ();

在1.0版本中,你应该使用:

io.sockets.connected[socketid].emit();

你可以这样做

在服务器上。

global.io=require("socket.io")(server);

io.on("connection",function(client){
    console.log("client is ",client.id);
    //This is handle by current connected client 
    client.emit('messages',{hello:'world'})
    //This is handle by every client
    io.sockets.emit("data",{data:"This is handle by every client"})
    app1.saveSession(client.id)

    client.on("disconnect",function(){
        app1.deleteSession(client.id)
        console.log("client disconnected",client.id);
    })

})

    //And this is handle by particular client 
    var socketId=req.query.id
    if(io.sockets.connected[socketId]!=null) {
        io.sockets.connected[socketId].emit('particular User', {data: "Event response by particular user "});
    }

在客户端,它很容易处理。

var socket=io.connect("http://localhost:8080/")
    socket.on("messages",function(data){
        console.log("message is ",data);
        //alert(data)
    })
    socket.on("data",function(data){
        console.log("data is ",data);
        //alert(data)
    })

    socket.on("particular User",function(data){
        console.log("data from server ",data);
        //alert(data)
    })

好吧,你必须抓住客户(惊喜),你可以选择简单的方法:

var io = io.listen(server);
io.clients[sessionID].send()

它可能会坏,我怀疑,但总是有可能io。客户端可能会被更改,因此请谨慎使用上述方法

或者您自己跟踪客户端,因此您将它们添加到连接侦听器中自己的客户端对象中,并在断开连接侦听器中删除它们。

我将使用后者,因为根据应用程序的不同,您可能希望在客户机上有更多的状态,因此可以使用类似clients[id] = {conn: clientConnect, data:{…}}可能会起作用。

你可以使用

//只向sender-client发送消息

套接字。Emit ('message', 'check this');

//或者你可以发送给所有的监听器,包括发送者

io。Emit ('message', 'check this');

//发送给除发送方之外的所有侦听器

socket.broadcast。Emit ('message', 'this is a message');

//或者你可以把它送到一个房间

socket.broadcast.to(“聊天室”)。Emit ('message', '这是给所有人的消息');