NodeJS开发web应用程序之http,express,socket.io介绍
1. http
Node中提供的http模块,其中封装了http服务器和http客户端,http.Server和http.request。 Q:如何用http创建http服务器?
var server = require('http').createServer(handler)
server.listen(8080);
function handler(req, rep) {
rep.writeHead(200, {'Content-Type': 'text/html'});
rep.write("hello world");
rep.end();
}
使用Server和createServer都可以创建http服务实例
2. express
基于Node.JS的web应用程序开发框架,内部集成了模版引擎,路由,中间件(应用层中间件/路由中间件/错误中间件),功能非常强大,是一个比较灵活的web框架,express框架简单封装了node的http模块, 当然我们也可以为express提供外置的http服务,这样做到express框架完成各种路由响应的工作,外部服务可以比较灵活,可以是http服务,也可以是https服务。
使用express内置http服务:
var app = require('express')();
app.listen(8080);
app.get('/', function(req, res) {
res.status(200).send("hello world");
});
使用外部http服务:
var app = require('express')();
var server = require('http').createServer(app);
server.listen(8081);
app.get('/', function(req, res) {
res.status(200).send("hello world");
});
var app = require('express')() 返回的是一个并不是一个服务,其实,app 就是一个 function(req, res){} ,同时具备一个属性app.listen() = function (port){ http.createServer(this).listen(port); } ,listen返回才是一个真正的http服务实例。
小插曲:Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 和express比较起来更轻量(不捆绑任何中间件),更现代(使用async+promise取代回调函数,增强错误处理)
新版本express抛弃了express.createServer(), 变成了express() 推荐使用4.x, 不再使用2.x和3.x
3. socket.io
socket.io是基于Node.JS和WebSocket协议的实时通信开源框架,包括了客户端的js和服务器端的nodejs,它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,也就是如果浏览器不支持websocket,会降级与long pooling实现实时通信。
socket.io与http使用同一端口 服务端代码:
var app = require('express')()
var server = require('http').createServer(app)
var io = require('socket.io')(server)
server.listen(8080)
app.use(require('express').static("."));
io.on('connection', function(socket){
console.log("client", socket.id, "is connected.");
socket.on("disconnect", function () {
console.log("client", socket.id, "is disconnected.");
});
});
客户端代码:
<!DOCTYPE html>
<html>
<head>
<title>socket.io</title>
</head>
<body>
<h1>socket.io</h1>
<h2>hello socket.io</h2>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io("http://localhost:8080");
socket.on("handshake", function(data) {
console.log(data);
socket.emit('client event', {"hello": "world"});
});
</script>
</body>
</html>
注意,客户端socket.io.js引用方式有两种, #1 动态方式,服务端运行后会在根目录动态生成socket.io的客户端js文件,客户端可以通过固定路径/socket.io/socket.io.js 添加引用。 #2 静态方式, <script src="node_modules/socket.io/client-dist/socket.io.min.js"></script> ,也可以引用CDN。 一般情况下推荐引用动态生成的客户端文件,因为这样客户端和服务端的版本可以保持一致,减少出错的几率。
|