0

我的客户端app.html:

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

我的服务器端 app.js:

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

server.listen(process.env.PORT || 8888);

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

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

如果我访问http://mywebsite.com:8888,控制台会显示:

Object {hello: "world"}

但如果我访问http://mywebsite.com/app.html,控制台会显示:

GET http://mywebsite.com/socket.io/socket.io.js 404 (Not Found)
Uncaught ReferenceError: io is not defined

重发到这里https://stackoverflow.com/a/10192084/990434我有 express v3.1.1,我也试过这个答案https://stackoverflow.com/a/14167488/990434无济于事。我从一个谷歌小组中尝试了一些其他随机的东西,我似乎在我漫长的混乱历史中找不到这些东西。知道如何解决这个问题吗?

4

1 回答 1

1

您混淆了存储在服务器上的文件和服务器提供的路由。虽然app.html是您服务器上的一个文件,但您的服务器不响应对/app.html. 相反,当请求到达时/,您的服务器会发送文件app.html。事实上,客户端/接收者永远不会知道它收到的文件是app.html在您的服务器上调用的。因此,当客户端(浏览器)访问时,他们会获得包含标签http://mywebsite.com:8888的 html 文件。script这些script标签具有使您的浏览器连接到 socket.io 的代码,该代码被编程为 on'connection'向客户端发送消息:

socket.emit('news', { hello: 'world' });

然后在浏览器中运行的客户端代码会收到消息

socket.on('news', function (data) {
    console.log(data);

然后将消息发送回服务器

socket.emit('my other event', { my: 'data' });

一切都按程序运行。但是,您的服务器上没有“路由器”来监听请求/app.html

于 2013-04-09T17:47:01.413 回答