繁体   English   中英

如何使用Socket.io和Node.js发出事件?

[英]How to emit event with Socket.io and Node.js?

我发现发出事件很困难,因为我对创建事件/使用套接字IO发出事件了解不多。

这是我在CASE“ / publish”上的问题:

var app = http.createServer(function (req, res) {
    if (req.method == "OPTIONS") {
        res.header('Access-Control-Allow-Origin', '*:*');
        res.send(200);
    } else {

        var u = url.parse(req.url,true),
            body = '';

        req.on('data',function(chunk) {
            body += chunk;
        });

        req.on('end',function() {
            if(body) {
                var data =JSON.parse(body);
                if(data._app_secret && data._app_secret == 'nonexistent') {
                    switch(u.pathname) {
                        case '/generateusersecret' :
                            findTokenByUser(req.headers.host+'_'+data.user_id,function(reply) {
                                if(reply) {
                                    jsonResponse(res,{userSecret : reply});
                                } else {
                                    generateToken(req.headers.host + '_' + data.user_id,data.user_id,res);
                                }
                            });
                        break;
                        case '/getusersecret' :
                            findTokenByUser(req.headers.host + '_' + data.user_id,function(reply) {
                                jsonResponse(res,{userSecret : reply});
                                console.log(reply);
                            });
                        break;
                        case '/publish':
                            if(data.type == 'notification'){
                                var newData = {
                                    item_id : data.item_id,
                                    message : data.message,
                                    recipient : data.channel,
                                    itemLink : data.itemLink,
                                    timestamp : data.timestamp,
                                    read : 0
                                }
                                notification = JSON.stringify(newData);
                                     // I need to emit my event here
                                     Socket.emit(THE EVENT HERE,notification DATA)
                            }

                        break;
                        default: 
                            jsonResponse(res,{error : "Unknown Command: " + u.pathname});
                        break
                    }
                } else {
                    res.writeHead(403, {'Content-Type': 'text/plain'});
                    res.end('Not authorized');
                }
            }
        });
    }
});

app.listen(config.port || 4000, null);

然后我需要听:

io.sockets.on('connection'function(socket){
   socket.on('THE EVENT HERE',function(NOTIFICATION DATA){
      //I NEED TO EMIT ANOTHER EVENT HERE
   })
})

有没有办法解决这个问题? 我必须这样做,因为我使用的是PHP的cURL,并且无法在客户端发出,因此需要在服务器端发出。

似乎您需要从服务器端发出一个事件,这是可能的,而主要功能来自socket.io。

要广播到所有连接的套接字,请在/publish端点中使用以下代码:

io.sockets.emit('event', data);

Socket.io还可以将消息广播到套接字组,此功能称为rooms

如果只想向一个套接字发送消息,则可以在套接字连接时用额外的属性标记套接字,然后在已连接套接字列表中搜索这些套接字。


完整的例子:

服务器端(server.js):

var http = require('http');
var fs = require('fs');

var server = http.createServer(handler);
var io = require('socket.io').listen(server);

function handler (req, res) {
  if (req.url === '/') {
    return fs.createReadStream(__dirname + '/index.html').pipe(res);
  }
  if (req.url === '/publish' && req.method === 'POST') {

    //this is what you are looking for:
    io.sockets.emit('super event', { message: 'hello' });
    //---------------------------------

    res.writeHead(200, {
      'Location': '/'
    });
    return res.end('');
  }
}

io.sockets.on('connection', function (socket) {
  socket.on('publish', function (data) {
    //if you need to emit to everyone BUT the socket who emit this use:
    //socket.broadcast.emit('super event', data);

    //emit to everyone
    io.sockets.emit('super event', data);
  })
});

server.listen(1080, function () {
  console.log('listening on http://localhost:1080');
});

客户端(index.html):

<html>
<head>
</head>
<body>
    hello world.
    <form action="/publish" method="post">
        <input type="submit" value="send a notification"></input>
    </form>

    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io.connect('/');
      socket.on('super event', function (data) {
        console.log(data);
        alert('got a message!');
      });
    </script>
</body>
</html>

用法

  • 将这两个文件放在一个目录中。
  • npm我socket.io
  • 节点server.js
  • 在浏览器中打开两个指向http://localhost:1080选项卡
  • 单击选项卡之一中的发送通知按钮

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM