【问题标题】:Socket.io connection not workingSocket.io 连接不工作
【发布时间】:2017-03-03 08:38:22
【问题描述】:

我正在尝试在 localhost 上建立一个简单的 socket.io 连接,但它不起作用。

我对我的代码的期望是,当我输入命令 node socket.js 时,它应该控制台“connected”,同时在浏览器的控制台上(我已经打开 index. html 页面)我应该在控制台中看到“Connected...”和“Something to show”。但它不起作用。

服务器运行良好,但我在终端和浏览器的控制台中都看不到数据。

我是不是做错了什么?

这是我的代码:

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

【问题讨论】:

  • 是的。没有错误。让我告诉你一件事。当我在 socket.js 中添加一个 get 路由并在其中写入 res.sendFile('/opt/lampp/htdocs/testproject/index.html'); 时,它可以工作。我想在没有路线的情况下这样做。
  • 尝试将您的 app.use 更改为 app.use(express.static('/opt/lampp/htdocs/testproject/')); 然后,这应该会导致服务器至少正确地提供 index.html。如果这仍然不起作用,那么就会发生一些非常奇怪的事情,因为您的 socket.io 代码可以在我的 node.js 服务器上运行。
  • 当我像您一样更改目录时,它起作用了。但只有当我在浏览器中点击 127.0.0.1:8080 时它才有效。为什么它不应该输出到 127.0.0.1:8080/testproject/index.html ?
  • "localhost:8080/" 指向那个文件夹。但是,index.html 高了一级。如果取出node_modules,“localhost:8080/”指向与index.html相同的文件夹。如果它有帮助,它会尝试获取文件“/opt/lampp/htdocs/testproject/node_modules/index.html”并且由于它不存在而默默地失败。
  • 如果您有新问题,请提出新问题,如果需要,请在此处链接。不要忘记查看我的以下答案

标签: javascript node.js sockets socket.io


【解决方案1】:

socket.io 库被设计为与 node.js 服务器协同工作,因此连接来自的页面需要被服务器识别(通过路由)。否则,它怎么能发回东西呢?如果您将 express.static 语句更改为 app.use(express.static('/opt/lampp/htdocs/testproject/'));,您将获得一个自动路由,该路由将允许库正确执行其操作。值得注意的是,如果您使用它,将来在加载页面时需要点击基本 URL(即localhost:8080/localhost:8080/index.html)。如果您更改文件名,请使用localhost:8080/newfilename.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/'));

io.on('connection', function(client) {
    console.log("connected");
   client.emit("message", "Some thing to show");
});
server.listen(8080);

【讨论】:

  • 如果我们不写 app.use(express.static()) 怎么办?这有什么重要性?
  • 因为你没有使用路由,"localhost:8080/" 将默认指向 socket.js 所在的位置。您还可以使用常量__dirname 在 express.static 中使用该位置。如果 socket.js 位于“/opt/lampp/htdocs”中,则等价的 express.static 将是 __dirname + '/testproject/'
  • 好的。现在,如果我想看到另一个主机上的另一个文件的响应,比如something.com/header.php(其中包含与上面的 index.html 相同的代码),那会起作用吗?
  • 如果您尝试从另一台主机访问 socket.io,这是一个完全不同的问题,很遗憾我并不精通。为此提出一个新问题,您将获得一套新问题眼睛盯着它。
  • 还有一个你可能知道的问题:stackoverflow.com/questions/42575953/…
【解决方案2】:

我可以建议你在这里尝试几件事。

首先请检查socket.io.js是否加载正确。

其次,先启动服务器,然后点击http://localhost:8080http://127.0.0.1:8080

据我所知,您在连接时不需要在客户端 js 上提及主机名。例如

而不是这个

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

你可以这样做

 var socket = io.connect();

【讨论】:

  • 如何检查 socket.io.js 是否加载?第二件事,我已经写了路径 /socket.io/socket.io.js 对吗?
  • 进一步我看到当我点击该 URL 时无法获取/响应。
  • 在 chrome 中打开网页。按 F12,Chrome 调试器将打开。现在,如果 Filepath 中有错误,它将使用 404 状态代码登录控制台。如果文件路径正确,您还可以检查网络选项卡。也不要忘记客户端有不同的socket.io.js。请检查您是否正在加载相同的文件
  • 这个答案需要更多的支持。这是在尝试了许多其他建议后奏效的那个。
  • 显示错误“io.connect is not a function”
【解决方案3】:

由于您在启动节点应用程序之前打开选项卡,因此无法正常工作。它将请求找不到的 socket.io.js 文件,并且不会重新加载。您需要在访问页面之前启动服务器,然后它应该可以工作。

【讨论】:

  • 你能在 NodeJS 中调试 socket.io,用这个开始:DEBUG=socket.io* node socket.js
  • 在您的 html 中将 var socket = io.connect('http://127.0.0.1:8080'); 更改为 var socket = io('http://127.0.0.1:8080');
  • 不存在这样的问题。但是,当我更改问题的 cmets 中提到的目录时,它起作用了。但我只在浏览 127.0.0.1:8080 时看到响应,而不是在 127.0.0.1:8080/testproject/index.html 上看到响应
  • 想回答这个问题吗? stackoverflow.com/questions/42575953/…
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2016-03-25
  • 2016-11-10
  • 2023-03-18
  • 2017-01-25
相关资源
最近更新 更多