11

我对 socket.io 示例有疑问。我的浏览器无法获取 socket.io.js 文件(控制台出现 404 错误)。


有效的代码:

服务器.js

var app = require('express').createServer()
  , io = require('socket.io').listen(81);

app.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

索引.html

<script src="http://192.168.1.104:81/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://192.168.1.104:81');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>


但是这个不是:

服务器.js

var app = require('express').createServer()
  , io = require('socket.io').listen(app);

app.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

索引.html

<script src="http://192.168.1.104:80/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://192.168.1.104:80');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

在这种情况下,我的浏览器无法获取 socket.io.js 文件。

4

2 回答 2

7

编辑:在下一个“编辑”之前,以下所有文字都是错误的。留在那里当痕迹……

你应该知道一件事,你应该做的两件事 + 所有需要的 Express 文档都在这里

  1. 快速过滤/处理对节点服务器的每次访问。这意味着当您尝试访问您的 socket.io 脚本文件时,Express 会尝试在您声明的路由中找到它,但您没有这样做(而且您没有这样做是对的)。
  2. 最重要的是:在 express 中声明一个静态的、非“计算的”文件夹,您将在其中放置所有静态文件(css、客户端脚本、图像):

    app.use('/static', express.static(__dirname + '/static'));

    这条线一定要放在you app.configurecall,之前app.use(app.router)(其实我是先放的)

    我喜欢这个 /static/scripts ;/静态/css;/static/img 文件夹组织,但你可以自由地适应你的需要。

  3. 将 socket.io 脚本文件的链接更改为相对路径(可选但强烈建议):src='/static/scripts/socket.io/socket.io.js'

编辑:我错了,非常非常错误,对此我深表歉意。Socket.io 生成所需的不同路径/文件,您不必声明它们,也不必复制任何客户端脚本文件。

请尝试将<script src="http://192.168.1.104:81/socket.io/socket.io.js"></script>客户端线路切换到正常的相对线路,<script src="/socket.io/socket.io.js"></script>因为这是您的代码和快速指南代码之间的唯一区别。

于 2012-04-17T08:24:27.530 回答
6

您使用的是哪个Express 版本?

API 已从 Express 2.x 更改为 3.x,因此答案在Migrating from 2.x to 3.x wiki的Socket.IO 兼容性部分:

Socket.IO 的.listen()方法将http.Server实例作为参数。
从 3.x 开始, 的返回值express()不是http.Server实例。要让 Socket.IO 与 Express 3.x 一起工作,请确保您手动创建http.Server实例并将其传递给 Socket.IO 的.listen()方法:

var app = express()
  , http = require('http')
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);

server.listen(3000);
于 2013-01-19T18:07:49.073 回答