新手请教Nodejs socket.io问题

新手请教Nodejs socket.io问题

这是 app.js

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


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);
  });
});
app.listen(8888);   
console.log('daemon start on http://localhost:8888');

这是 index.html

<script src="/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost:8888');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

在命令行发布 app.js 以后。控制台也显示了 :socket.io started

然后我在浏览器敲入: http://localhost:8888 却提示 io 未定义… 各们看倌,请问一下这是啥问题?


6 回复

你遇到的“io 未定义”的问题是因为你的 HTML 文件中引用的 socket.io.js 路径不正确。你需要确保客户端能够正确地加载 socket.io.js

以下是修改后的代码:

修改后的 app.js

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

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

server.listen(8888, function () {
  console.log('Daemon started on http://localhost:8888');
});

修改后的 index.html

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

关键点解释:

  1. 路径问题:在 index.html 中,<script src="/socket.io/socket.io.js"> 确保了 socket.io.js 文件被正确加载。
  2. sendFile 方法:在 app.js 中使用 res.sendFile 代替 res.sendfile,因为后者已被弃用。
  3. io.on 方法:在 app.js 中使用 io.on('connection', ...) 方法来监听连接事件。

运行步骤:

  1. 在命令行中运行 node app.js 启动服务器。
  2. 打开浏览器并访问 http://localhost:8888

这样应该可以解决你遇到的 io 未定义的问题,并且能够正常连接到 Socket.IO 服务器。


楼主的 html 文件没弄出来… 建议先参照 markdown 的语法把排版弄好, 然后对照下这里, 看下 <script> 标签有没有漏 http://socket.io/#how-to-use 特别是排版啊…

我运行了一下你这个app.js(将index.html设为空)是没有问题的,问题可能出在你的那个index.html里面。也可以把index.html贴出来看看!

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

var socket = io.connect(‘http://localhost:8888’); socket.on(‘news’, function (data) { console.log(data); socket.emit(‘my other event’, { my: ‘data’ }); });

这是我的index.html. 在最上面引用了socket.io.js(src="/socket.io.js");这个文件我放在和index.html同一个目录的。 为啥出现<script>就显示不出来了?

socket.io.js不是你放在那个目录下的,是自动生成的。 所以你路径错了。 只要你正确安装了socket.io 这样写就是对的。 <script src="/socket.io/socket.io.js"></script>

你遇到的问题是因为在 index.html 文件中引用 socket.io 的方式不正确。socket.io-client 需要通过 CDN 或本地路径正确引用。

以下是修改后的代码:

修改后的 index.html

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

解释

  1. 引用 socket.io:

    • 在你的 index.html 文件中,你需要正确引用 socket.io 库。正确的路径是 /socket.io/socket.io.js。这通常由 Node.js 的 socket.io 模块自动提供。
    • 如果你在本地开发环境中使用 socket.io,确保你已经安装了 socket.io 并且服务器已经启动。
  2. 检查服务器端代码:

    • 你的 app.js 文件看起来没有问题。它正确地设置了 Express 服务器,并且通过 socket.io 监听了连接事件。

示例代码

确保你已经安装了 expresssocket.io

npm install express socket.io

然后启动你的应用:

node app.js

如果你仍然遇到问题,请确保 socket.io.js 文件可以从浏览器访问到,并且服务器端没有错误。

希望这能解决你的问题!

回到顶部