node 网络模块

288 阅读2分钟
  • 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

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

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!');
 };