NodeJS和Socket.io

4

我刚刚安装了Node.js和Socket.IO,但我在连接客户端到服务器时遇到了问题。

我的服务器代码如下:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(3000, 'localhost');
console.log('Server running at http://localhost:3000/');

var io = require('socket.io').listen(3000);

io.sockets.on('connection', function (socket) {

  socket.emit('Hi.') ;

});

在我的客户端上:

<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:3000');

socket.on('connect', function () {
  socket.emit('set nickname', confirm('What is your nickname?'));
  socket.on('ready', function () {
    console.log('Connected !');
    socket.emit('msg', confirm('What is your message?'));
  });
});

我在Chrome检查器中收到了许多错误信息:

GET http://localhost:9261/socket.io/socket.io.js 404 (Not Found)
Uncaught ReferenceError: io is not defined
6个回答

2

看起来你只向客户端发送了“Hello World”,而没有包含客户端代码的HTML。

你的服务器代码应该像这样(来自http://socket.io/#how-to-use):

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

您的客户端代码应该在 index.html 中。同时确保您有一个名为 socket.io 的文件夹,其中包含脚本 socket.io.js

我已经看了几遍,但似乎还是无法使其正常工作。现在我遇到了以下错误:未捕获的引用错误:require未定义,未捕获的引用错误:io未定义。 - imperium2335
"require未定义" - 看起来你正在客户端使用require(这是错误的)。你如何运行服务器? - mihai
通过命令提示符使用命令:node server.js,它运行良好,没有错误。 - imperium2335
顺便说一下,我正在同一台机器上运行服务器和客户端,这不可能吗?必须在不同的机器/虚拟机上吗? - imperium2335
我重新安装了它,修复了那个错误,但是客户端部分仍然出现“io未定义”的问题。 - imperium2335
显示剩余2条评论

2

你没有通过NodeJS为客户端提供服务,这样是行不通的:

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

尝试使用这个替代方案:
<script src="http://localhost:3000/socket.io/socket.io.js"></script>

我已经尝试过了,我不再遇到404错误,只是会提示require和io未定义。 - imperium2335
你确定已经安装了socket.io吗?你必须打开终端,进入与你的服务器相同的目录,然后输入“npm install socket.io”。 - Saad Bourziza
我正在使用Windows操作系统,使用命令提示符将其安装在我的当前应用程序文件夹中(我正在使用Dreamweaver)。它将socket.io安装到一个名为node_modules的文件夹中,因此目录结构如下:F:\xampp\htdocs\mySite\node_modules\socket.io。 - imperium2335

1
这段代码是用来让客户端连接到 Node 服务器的。代码如下:

<script src="http://localhost:3000/socket.io/socket.io.js"></script>var socket = io.connect("http://localhost:3000");

这段代码可以正常运行。

1

无法连接,因为您的客户端无法找到socket.io.js文件。您可以通过使用正确的文件解决此问题,从node_modules\socket.io\node_modules\socket.io-client\dist目录中使用socket.io.js并将其放入本地目录中,在脚本标记中使用它。


0
请注意,当您转移到生产环境时,客户端中的代码应该被更新:
var socket = io.connect('http://localhost:3000');

把“

”翻译成类似的内容。

var socket = io.connect('my_host');

我已经通过提取参数req.headers.host,将my_host发送到了加载socket.io的页面的客户端脚本中,因此对我来说它看起来像:

 io.connect('http://' + host)

你可以通过 express-expose 在客户端暴露变量。


0

这很可能是因为io没有被正确实例化,因此出现了未捕获的引用错误:io未定义

// Instantiate without argument
var io = require('socket.io')();
// Instantiate with new keyword
var Server = require('socket.io')
  , io = new Server();

// Instantiate io server with app as argument
var app = require('http').createServer(handlerFunc)
  , io = require('socket.io')(app);
app.listen(80);

// Attaching socket.io with express server
var app = express()
  , server = require('http').createServer(app)
  , io = require('socket.io')(server);
server.listen(80, handlerFunc);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接