我正在尝试在 localhost 上构建一个简单的 socket.io 连接,但它无效。
我对我的代码的期望是,当我输入命令node socket.js
时,它应该控制“已连接”并同时在浏览器的控制台上(我已经打开 index.html 页面在浏览器中)我应该在控制台“已连接... ”和“要显示的内容”中看到。但它不起作用。
服务器运行正常但我没有在终端和浏览器的控制台中看到数据。
我做错了吗?
这是我的代码:
的index.html
<html lang="en">
<head>
</head>
<body>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://127.0.0.1:8080');
socket.on('connect', function(data) {
console.log("Connected...");
socket.on("message", function(data){
console.log(data);
});
});
</script>
</body>
</html>
socket.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json({type: '*/*'}));
var server = require('http').createServer(app);
var io = require('socket.io')(server);
app.use(express.static('/opt/lampp/htdocs/testproject/node_modules'));
io.on('connection', function(client) {
console.log("connected");
client.emit("message", "Some thing to show");
});
server.listen(8080);
我的目录结构如下:
的htdocs / testproject /
.. node_modules /
.. index.html的
.. socket.js
编辑:但是,当我在socket.js中添加它时,我的代码可以正常工作
app.get('/home', function(req, res,next) {
res.sendFile(__dirname + '/index.html');
});
答案 0 :(得分:2)
socket.io库旨在与node.js服务器协同工作,因此连接所来自的页面需要能够被服务器识别(通过路由)。否则,它怎么能发回去?如果将express.static语句更改为 var1="7.6.0"
var2="7.1.0"
awk -v var1="$var1" -v var2="$var2" 'BEGIN{ if(var1 > var2) {print "higher"} else {print "lower"}}'
higher
,您将获得一个允许库正确执行其操作的自动路由。值得注意的是,如果您使用此页面,以后在加载页面时,您需要点击基本网址(即app.use(express.static('/opt/lampp/htdocs/testproject/'));
或localhost:8080/
)。如果您更改文件名,请使用localhost:8080/index.html
。
在socket.js中:
localhost:8080/newfilename.html
答案 1 :(得分:1)
我可以建议你在这里尝试一些事情。
首先请检查 socket.io.js 是否正确加载。
其次,首先启动服务器,然后点击 http://localhost:8080 或 http://127.0.0.1:8080
据我所知,在连接时,您不需要在客户端js上提及主机名。 E.g。
而不是
var socket = io.connect('http://127.0.0.1:8080');
你可以这样做
var socket = io.connect();
答案 2 :(得分:0)
由于您在启动节点应用程序之前打开了选项卡,因此无效。它将请求无法找到的socket.io.js文件,不会重新加载。您需要在访问页面之前启动服务器,然后它才能运行。