【问题标题】:How NodeJS and Socket.IO serve socket.io.jsNodeJS 和 Socket.IO 如何服务于 socket.io.js
【发布时间】:2014-12-16 08:11:02
【问题描述】:

我正在通过一本书(学习节点)中的以下代码学习 NodeJS 和 Socket.IO。这个例子奏效了。但我想知道节点是如何为statment <script src="/socket.io/socket.io.js"></script> 中的 socket.io.js 文件提供服务的,因为项目根目录中没有名为 socket.io 的文件夹,我也没有写入服务器静态文件的代码。这是通过 Socket.IO 模块完成的吗?使用 express 服务静态文件会不会冲突?

客户端代码

<html lang="en">
<head>
<meta charset="utf-8">
<title>bi-directional communication</title>
<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect('http://localhost:8124');
    socket.on('news', function (data) {
        var html = '<p>' + data.news + '</p>';
        document.getElementById("output").innerHTML=html;
        socket.emit('echo', { back: data.news });
    });
</script>
</head>
<body>
    <div id="output"></div>
</body>
</html>

服务器端代码

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

var counter;
app.listen(8124);

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

io.sockets.on('connection', function (socket) {
    socket.emit('news', { news: 'world' });
    socket.on('echo', function (data) {
        if (counter <= 50) {
            counter++;
            console.log(data.back);
            socket.emit('news', {news: data.back});
        }
    });
});

【问题讨论】:

  • 虚拟路径。基本上,服务器端库处理以“/socket.io/”开头的请求并输出资源。实际文件在其他地方。

标签: javascript node.js express socket.io


【解决方案1】:

读了几遍,终于明白了

在服务器应用程序中,当创建 HTTP Web 服务器时,它被传递给 Socket.IO 的监听事件:

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

发生的情况是 Socket.IO 拦截发送到 Web 服务器的请求并监听 请求:

/socket.io/socket.io.js

Socket.IO 做了一些巧妙的幕后花絮,以确定什么是重新 回复了。如果客户端支持 WebSockets,则返回的 JavaScript 文件 是使用 WebSockets 实现客户端连接的一种。如果客户不 支持 WebSockets,但确实支持 Forever iFrame (IE9),它返回那个特定的 JavaScript 客户端代码等。

【讨论】:

  • socket.io 服务器端代码只是挂钩/socket.io 的路由,因此它可以在以该路径开头的任何路由上提供任何它想要的服务。这就是它看到/socket.io/socket.io.js 请求的方式。但是,您真的确定它会根据客户端功能提供不同的服务吗?我的印象是它无论如何都提供相同的 JS 文件,socket.io.js 是检查客户端环境并决定在客户端上运行时要做什么。
  • 您不必将此路径用于socket.io.js。您可以从 CDN 提供它,但让您的节点服务器以这种方式提供服务的好处是,您可以保证拥有一个同步且版本相同的客户端和服务器端 socket.io 库,因为无论何时更新服务器端的 socket.io(带有 NPM),你也会自动获取客户端库。
猜你喜欢
  • 2013-07-18
  • 2012-11-07
  • 2014-11-20
  • 2013-04-26
  • 1970-01-01
  • 2013-08-23
  • 2017-02-02
  • 2012-12-24
  • 2013-05-21
相关资源
最近更新 更多