socket.io:无法加载资源

我试图开始使用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 ..

问题

  • 首先,您需要查看服务器绑定的服务器端口( app.listen(3001); )在客户端,以便根本到达服务器。

  • 至于socket.io,在链接标记的源代码之前添加http://localhost:3001可以解决这个问题。 这显然是由于networking将端口绑定到本地主机的方式,但是我会尝试find更多关于原因的信息;

要改变什么:


服务器的端口绑定:

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>


如果您使用express 3.x版,则存在Socket.IO兼容性问题,需要进行一些微调才能迁移 :

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

这里是一个简单的例子:

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

如果您试图使其在另一台计算机上运行,​​并且出现此错误,则可能会发现这很有用。

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

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

尝试这个

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

希望能帮助到你

首先,Socket.io“ 如何使用 ”文档是模糊的(也许是误导性的); 尤其是在为Socket.io客户端编写代码时。

其次,您在StackOverflow中给出的答案太具体了。 您不必手动硬编码Socket.io客户端的协议,主机名和端口号; 这不是一个可扩展的解决scheme。 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实现

创build以下文件:

服务器(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> 

我知道这是非常晚,但我find了一个解决scheme,可能以前已经设置node.js的人。 我的机器需要更换硬件,当它回来时,我注意到不less设置恢复为出厂默认设置。 我也遇到了上面讨论的错误。

运行

sudo apachectl启动

从terminal固定了我的问题。