NodeJS和Socket.IO如何为Socket.IO.js服务

How NodeJS and Socket.IO serve socket.io.js

本文关键字:IO Socket js 服务 NodeJS      更新时间:2023-09-26

我通过一本书中的以下代码(学习节点)学习NodeJS和Socket.IO。这个例子奏效了。但我想知道节点是如何为声明<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});
        }
    });
});

经过一番阅读,我得到了的解释

在服务器应用程序中,当创建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客户端代码等等。