【问题标题】:NodeJS and Socket.io - Defining Server and sockets issueNodeJS 和 Socket.io - 定义服务器和套接字问题
【发布时间】:2012-09-18 15:34:25
【问题描述】:

这可能是一个简单的错误。我有一个运行 socket.io 的 nodejs 服务器,我已经在服务器中完成了所有工作。

但是,我希望能够通过 PHP 将 CURL 发布到节点服务器,并让它发出数据。我可以让服务器接收请求,但是当我尝试发出数据时,我收到一个错误,提示未定义套接字。

这在我的代码中很明显。我的问题是,在设置服务器之前如何要求 socket.io?希望我的代码片段能帮助解释我的问题:

var http = require('http')
, url = require('url')
, fs = require('fs')
, server;

server = http.createServer(function(req, res) {
// your normal server code
var path = url.parse(req.url).pathname;
switch (path){
   case '/':
     res.writeHead(200, {'Content-Type': 'text/html'});
     res.write('<h1>Hello! <a href="/index.html">Enter</a></h1>');
     res.end();
     break;
   case '/index.html':
     fs.readFile(__dirname + path, function(err, data){
        if (err) return send404(res);
        res.writeHead(200, {'Content-Type': path == 'json.js' ? 'text/javascript' : 'text/html'})
        res.write(data, 'utf8');
        res.end();
     });
    break;
   case '/write.html':
     fs.readFile(__dirname + path, function(err, data){
        if (err) return send404(res);
        res.write(data, 'utf8');
        res.end();
     });
   break;
  case '/post':
     console.log(req.toString());
     socket.broadcast.emit('user', {state: 'PHP Post', userid: 'PHP'});
     res.writeHead(200);
     res.end();
   break;

  default: send404(res);
}
}),

send404 = function(res){
   res.writeHead(404);
   res.write('404');
   res.end();
};

server.listen(843);

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

// Regular socket.io events

【问题讨论】:

  • 我认为有些混乱。在检查 socket.io 的文档时,他们说“广播”将事件广播到所有套接字,但调用它的套接字除外。现在哪个是您要使用的套接字,这是我的困惑....
  • 是的,我明白这一点。我的问题是 socket.broadcast.emit('user', {state: 'PHP Post', userid: 'PHP'}); 部分无法工作,因为还不需要 socket.io。但是如果我在定义我的服务器之前需要 socket.io,它就没有服务器可以监听。

标签: php node.js curl socket.io


【解决方案1】:

在设置服务器之前,我如何要求 socket.io?

这部分很简单;在文件的顶部,执行以下操作:

var http = require('http')
, url = require('url')
, fs = require('fs')
, socketIO = require('socket.io')  // <-- added line
, server;

在底部:

var io = socketIO.listen(server);

问题是,在您的 POST 处理程序中,您使用的是 socket.broadcast.emit,但未定义 socket。您是否尝试向所有 Socket.IO 用户发送消息?如果是这样,您可以使用io.sockets.emit;我可能会做这样的事情:

var http = require('http')
, url = require('url')
, fs = require('fs')
, server
, io;

...

case '/post':
   console.log(req.toString());
   io.sockets.emit('user', {state: 'PHP Post', userid: 'PHP'});
   res.writeHead(200);
   res.end();
 break;

...

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

如果您尝试将数据发送到单个套接字或除特定套接字之外的每个套接字(这是您通常使用socket.broadcast 的方式),您将需要以某种方式将 HTTP 请求映射到 Socket。 IO 插座; using sessions for this is common.

【讨论】:

  • 太棒了,这正是我所需要的。非常感谢。
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 2021-03-31
  • 2021-08-30
  • 1970-01-01
  • 2018-11-25
  • 2014-10-18
  • 1970-01-01
  • 2018-03-20
相关资源
最近更新 更多