- node是一个面向网络而生的平台,事件驱动、无阻塞、单线程,适合io密集场景
- node 提供net,dgram,http,https四个网络模块
下面分别介绍 tcp,udp,http及websocket 协议应用。
1. tcp
node:net 模块提供了异步的网络 API,用于创建基于流的 TCP 或 IPC
服务器 net.createServer()
let net = require('net')
let server = net.createServer({}, socket => {
// socket 是一个双工流
console.log('client connected')
socket.on('data', data => {
console.log(data.toString())
socket.write('server: hello server')
})
// 服务器收到客户端发出的关闭请求时,会触发end事件
socket.on('end', () => {
console.log('client disconnected')
})
socket.on('close', () => {
console.log('client closed')
})
})
server.listen(8080, () => {
console.log('server start');
})
客户端 net.createConnection()
let net = require('net')
// new net.Socket() 返回的是一个双工流
let client = new net.Socket()
client.connect(8080, 'localhost', () => {
console.log('connected server')
client.write('client: hello server');
})
client.on('data', function (data) {
console.log(data.toString())
});
setTimeout(()=>{
client.end()
},5000)
2. udp
- udp 和 tcp都属于osi模型的传输层,udp是无连接的,具有单播,多播,广播
服务端代码:
const dgram = require('dgram');
const server = dgram.createSocket('udp4');
server.on('message',(msg,rinfo)=>{
console.log(`receive message from ${rinfo.address}:${rinfo.port}`);
server.send('exit',rinfo.port,rinfo.address)
});
server.bind('8060');
server.on('close',()=>{
console.log('socket已关闭');
});
server.on('error',(err)=>{
console.log(err);
});
server.on('listening',()=>{
console.log('socket正在监听中...');
});
客户端代码:
const dgram = require('dgram');
const client = dgram.createSocket('udp4');
client.on('message',(msg,rinfo)=>{
if(msg=='exit') client.close();
console.log(`receive message from ${rinfo.address}:${rinfo.port}`);
});
client.send(`hello`,8060,'1.1.1.69');
client.on('close',()=>{
console.log('socket已关闭');
});
client.on('error',(err)=>{
console.log(err);
});
3. http
服务端代码:
var http = require('http');
var fs = require('fs');
var url = require('url');
// 创建服务器
http.createServer( function (request, response) {
// 解析请求,包括文件名
var pathname = url.parse(request.url).pathname;
// 输出请求的文件名
console.log("Request for " + pathname + " received.");
// 从文件系统中读取请求的文件内容
fs.readFile(pathname.substr(1), function (err, data) {
if (err) {
console.log(err);
// HTTP 状态码: 404 : NOT FOUND
response.writeHead(404, {'Content-Type': 'text/html'});
}else{
// HTTP 状态码: 200 : OK
response.writeHead(200, {'Content-Type': 'text/html'});
// 响应文件内容
response.write(data.toString());
}
// 发送响应数据 response.end(); });
}).listen(8080);
console.log('Server running at http://127.0.0.1:8080/');
客户端代码:
var http = require('http');
var options = {
host: 'localhost',
port: '8080',
path: '/index.html'
};
var callback = function(response){
var body = '';
response.on('data', function(data) { body += data; });
response.on('end', function() {
console.log(body);
});
}
var req = http.request(options, callback);
req.end();
serve
server.closeAllConnections()server.closeIdleConnections()server.headersTimeoutserver.listen()server.listeningserver.maxHeadersCountserver.requestTimeoutserver.setTimeout([msecs][, callback])server.maxRequestsPerSocketserver.timeoutserver.keepAliveTimeout
request
- [
request.cork()] - [
request.end([data[, encoding]][, callback])] - [
request.destroy([error])]- [
request.destroyed]
- [
- [
request.finished] - [
request.flushHeaders()] - [
request.getHeader(name)] - [
request.getHeaderNames()] - [
request.getHeaders()] - [
request.getRawHeaderNames()] - [
request.hasHeader(name)] - [
request.maxHeadersCount] - [
request.path] - [
request.method] - [
request.host] - [
request.protocol] - [
request.removeHeader(name)] - [
request.reusedSocket] - [
request.setHeader(name, value)] - [
request.setNoDelay([noDelay])] - [
request.setSocketKeepAlive([enable][, initialDelay])] - [
request.setTimeout(timeout[, callback])] - [
request.socket] - [
request.uncork()] - [
request.writableEnded] - [
request.writableFinished] request.write(chunk[, encoding][, callback])
responce
response.addTrailers(headers)response.connectionresponse.cork()response.end([data[, encoding]][, callback])response.finishedresponse.flushHeaders()response.getHeader(name)response.getHeaderNames()response.getHeaders()response.hasHeader(name)response.headersSentresponse.removeHeader(name)response.reqresponse.sendDateresponse.setHeader(name, value)response.setTimeout(msecs[, callback])response.socketresponse.statusCoderesponse.statusMessageresponse.strictContentLengthresponse.uncork()response.writableEndedresponse.writableFinishedresponse.write(chunk[, encoding][, callback])response.writeContinue()response.writeEarlyHints(hints[, callback])response.writeHead(statusCode[, statusMessage][, headers])response.writeProcessing()
4. websocket
- 只建立一次tcp连接,长链接,服务器推送
- websocket 建立连接 握手阶段 使用 http请求,请求头多了
Upgrade:websocket
Connection:Upgrade
Sec-Websocket-Key:xxxxx
表示服务器升级协议为websocket,Sec-Websocket-Key 用于安全校验
服务端代码:
var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({ port: 8181 });//服务端口8181
wss.on('connection', function (ws) {
ws.on('message', function (message) {
ws.send('2- i am fine,and you ?');
});
});
客户端代码:
var ws = new WebSocket("ws://localhost:8181");
ws.onopen = function (e) {
ws.send('1- how are you!');
}
ws.onmessage = function (e) {
console.log("收到数据:" + e.data);
ws.send('3- i am fine ,too!');
};