20

我正在尝试开始使用 socket.io 和 node.js。

在 socket.io 网站上的第一个示例之后,我在浏览器的控制台中收到以下错误:

Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:3001/socket.io/socket.io.js
Uncaught ReferenceError: io is not defined 

这是我的 server.js

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

app.listen(3001);

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);
  });
});

这是我的 index.html

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>
  </body>
</html>

我已经安装了socket.io ..

4

7 回答 7

26

问题

  • 首先,您需要在app.listen(3001);客户端查看服务器绑定的服务器端口 ( ),以便完全访问服务器。

  • 至于socket.io,http://localhost:3001在链接标签中的其余源代码之前添加解决了这个问题。这显然是由于网络将端口绑定到 localhost 的方式,但是我将尝试找到有关原因的更多信息;

要改变什么:


服务器的端口绑定:

var socket = io.connect('http://localhost');

应该改为

var socket = io.connect('http://localhost:3001');



使 socket.io 行为:

<script src="/socket.io/socket.io.js"></script>

应该改为

<script src="http://localhost:3001/socket.io/socket.io.js"></script>


于 2012-07-26T07:54:27.740 回答
7

如果您使用的是express3.x 版,则存在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-02-06T19:28:27.870 回答
3

首先,Socket.io“如何使用”文档含糊不清(可能具有误导性);尤其是在为 Socket.io 客户端编写代码时。

其次,您在 StackOverflow 上得到的答案太具体了。您不必手动硬编码 Socket.io 客户端的协议、主机名和端口号;这不是一个可扩展的解决方案。Javascript 可以使用位置对象为您处理这个 - window.location.origin.

Socket.io 入门

安装

Socket.io 需要安装服务器和客户端。

安装服务器
npm install socket.io

要使用客户端,请将此脚本添加到您的文档 (index.html)
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>

使用 Express 3/4 实现

创建以下文件:

服务器 (app.js)

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);

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

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

客户端 (index.html)

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
  // origin = http(s)://(hostname):(port)
  // The Socket.io client needs an origin
  // with an http(s) protocol for the initial handshake.
  // Web sockets don't run over the http(s) protocol,
  // so you don't need to provide URL pathnames.
  var origin = window.location.origin;
  var socket = io.connect(origin);
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>
于 2016-02-23T23:52:50.010 回答
0

尝试这个

var app = express()
,http = require('http');

var server = http.createServer(app);
server.listen(3001);
io = require('socket.io').listen(server);
io.set('log level', 1); 

希望能帮助到你

于 2014-02-05T13:00:25.697 回答
0

如果您尝试在另一台计算机上运行它并且遇到此错误,您可能会发现这很有用。

var host = window.location.hostname; 
var socket = io.connect('http://' + host);

如果您使用的是 https,那么显然您还需要更改协议。在我的情况下,我需要创建一个可以在多台本地计算机上运行的服务器,因此在这里放置一个固定地址是行不通的,因为套接字需要连接到不同的地址,具体取决于您从哪个服务器加载页面。在此处添加此内容,因为它也可能对其他人有所帮助。

于 2014-02-05T12:46:29.183 回答
0

以下更改终于对我有用

const app = express(); const http = require('http'); const server = http.createServer(app); const io = require('socket.io')(server)

于 2021-03-04T17:18:44.817 回答
-3

我知道这已经很晚了,但是我为那些以前可能已经设置过 node.js 的人找到了一个解决方案。我的机器需要更换硬件,当它回来时,我注意到很多设置都恢复了出厂默认设置。我也收到了上面讨论的错误。

跑步

须藤 apachectl 开始

从终端解决了我的问题。

于 2013-05-09T00:50:18.777 回答