NodeJS和Socket.IO如何为Socket.IO.js服务
How NodeJS and Socket.IO serve socket.io.js
我通过一本书中的以下代码(学习节点)学习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客户端代码等等。
相关文章:
- 如何使用Socket.io将命令从客户端发送到服务器
- Socket.io socket.emit 不将数据传递到服务器
- Socket.IO socket.id 更改同一客户端而不重新连接
- Node.js+Express+socket.io-socket.io服务不正常
- 节点.js /socket.io/socket.io.js 找不到
- 发出到套接字 IO socket.id
- 将socket.io/socket.io.js加载到html头中返回"ReferenceError:io未定义
- 错误连接拒绝http://localhost:3000/socket.io/socket.io.js.
- Sails.js IO.socket not firing
- 使用AJAX与套接字.IO socket消息
- Socket.io socket.disconnect();
- 正在检索io.socket中的所有套接字对象
- Socket IO - Socket.Emit被发送到所有客户端
- Express.js 'socket.io/socket.io.js 404'
- 使用公共IP运行/socket.io/socket.io.js
- socket.io/socket.io.js stuck on (pending) - Node.js
- 我得到了GEThttp://localhost:81/socket.io/socket.io.jsnet::ERR_CO
- Node.js /socket.io/socket.io.js not found express 4.0
- 带io.socket的sails应用程序
- Express -如何在路由文件中使用io.socket.emit