我正在尝试使用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 ..
答案 0 :(得分:24)
首先,您需要查看服务器在客户端绑定的服务器端口(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>
答案 1 :(得分:6)
如果您使用的是express
版本3.x,则有Socket.IO compatibility issues that require a bit of fine tuning to migrate:
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);
答案 2 :(得分:1)
首先,Socket.io&#34; How To Use&#34;文件含糊不清(也许是误导性的);特别是在为Socket.io客户端记录代码时。
其次,你在StackOverflow上给出的答案太具体了。您不必手动硬编码Socket.io客户端的协议,主机名和端口号;这不是一个可扩展的解决方案。 Javascript可以使用位置对象window.location.origin
来处理此问题。
Socket.io需要安装服务器和客户端。
安装服务器
npm install socket.io
要使用客户端,请将此脚本添加到您的文档(index.html)
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
创建以下文件:
服务器(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>
答案 3 :(得分:0)
如果您尝试在另一台计算机上运行此操作并且收到此错误,您可能会觉得这很有用。
var host = window.location.hostname;
var socket = io.connect('http://' + host);
如果您使用的是https,那么显然您也需要更改协议。在我的情况下,我需要创建一个可以在几台本地计算机上运行的服务器,因此在这里放置一个固定的地址是行不通的,因为套接字需要连接到不同的地址,具体取决于你从哪个服务器加载页面。在这里添加它可能对其他人也有帮助。
答案 4 :(得分: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);
希望有所帮助
答案 5 :(得分:0)
以下更改最终对我有用
const app = express(); const http = require('http'); const server = http.createServer(app); const io = require('socket.io')(server)
答案 6 :(得分:-2)
我知道这已经非常晚了,但我找到了一个解决方案,可以帮助那些可能先前设置node.js的人。我的机器需要更换硬件,当它返回时,我注意到很多设置都恢复到出厂默认状态。我也得到了上面讨论的错误。
运行
sudo apachectl start
来自终端的解决了我的问题。