TCP、HTTP和Node.js的那些事

TCP

TCP是用來計算機之間進行通訊的,經過編寫客戶端和服務端聊天的代碼,對於服務器與客戶端的工做步驟有了深入的瞭解。在node中爲了實現TCP,提供了一個net模塊,net 模塊給你提供了一個異步的網絡封裝,它包含建立服務器和客戶端(稱爲流)的功能。html

建立TCP服務端

  • net.createServer(options,connectionListener);node

建立一個tcp服務,裏面放的是回調函數 監聽函數,當鏈接到來時纔會執行。數組

其中傳進去的參數socket是套接字,幫咱們實現會話,每個客戶端對應的socket都是不同的。是一個duplex雙工流,能夠支持讀操做和寫操做。bash

  • server.listen()服務器

能夠設置服務監聽的端口,主機名, backlog服務端處理的最大請求,默認是511,能夠不寫。還有回調函數,當服務啓動成功會調用網絡

let net = require('net');
let server = net.createServer(function(socket){
    ...
})
server.listen(8080,'localhost',function(){
    console.log(`server start 8080`)
});複製代碼

接下來能夠對服務端進行配置app

設置一個服務端最大的連接數

server.maxConnections = 6;複製代碼

獲得鏈接的時候觸發方法

但願每次請求到來時都有一個提示,當前最大鏈接多少個,如今一共鏈接多少個異步

server.getConnections(function(err,count){ 
    socket.write(`當前最大容納${server.maxConnections},如今${count}人`)
});複製代碼

接受客戶端數據

  • 讀取客戶端的輸入socket

socket.on('data',function(data){
    console.log(data); 
});複製代碼
  • 暫停讀取tcp

socket.pause();複製代碼
  • 恢復讀取

socket.resume();複製代碼

pipe&unpipe

監聽客戶輸入時,將客戶端輸入的內容寫入到文件內容。

若是有兩個客戶端,就有兩個socket,其中一個關閉了,另外一個就寫不進去了

let net = require('net');
let path = require('path');
let ws = require('fs').createWriteStream(path.join(__dirname,'./1.txt'));
let server = net.createServer(function(socket){
    socket.pipe(ws,{end:false}); // 因此能夠設置這個可寫流不關閉
    setTimeout(function(){
        ws.end(); // 關閉可寫流
        socket.unpipe(ws); // 取消管道,就不能傳輸了
    },5000)
});
server.listen(8080);複製代碼

關閉客戶端

  • socket.end(); 除了手動關閉,咱們也能夠調用此方法讓它關閉。

關閉服務端

  • server.close();

close事件表示服務端不在接收新的請求了,當前的還能繼續使用,當客戶端所有關閉後會執行close事件。

// close事件只有調用close方法纔會觸發
server.on('close',function(){
    console.log('服務端關閉');
})複製代碼
  • server.unref();

unref() 不會觸發close事件,只有當全部客戶端都關閉了,服務端才關閉,若是有人進來(有新請求)仍然能夠。

建立TCP客戶端

  • net.createConnection 是用來建立於服務端的鏈接

let net = require('net');
​
let socket = net.createConnection({port:8080},function(){
    socket.write('hello');
    socket.on('data',function(data){
        console.log(data);
    });
});複製代碼

HTTP

node中爲了實現http一樣也提供了一個模塊,叫http模塊,其中封裝了高效的http服務器和http客戶端 ,與net模塊用法類似。

建立HTTP服務器

  • request

當客戶端請求到來的時候,該事件被觸發。

咱們最經常使用的仍是request事件,http也給這個事件提供了一個捷徑:http.createServer([requestListener])

  • 參數res req

傳入中的參數req是請求,是一個可讀流,res是響應 是一個可寫流。是經過socket解析出來請求和響應。

建立HTTP服務器有兩種方法

  1. 第一種

let http = require('http'); 
let server = http.createServer();
server.on('request',function(req,res){
    req.on('end',function(){
        res.write('hello');
        res.end('world');
    });
});
server.listen(8080);複製代碼
  1. 能夠這樣簡寫

let http = require('http');
let server = http.createServer(function(req,res){
  res.end('ok');
});
server.listen(8080);複製代碼

關閉HTTP服務器

let http = require('http');
let server = http.createServer(function(req,res){
});
server.on('close',function(){
    console.log('服務器關閉');
});
server.listen(8080,'127.0.0.1',function(){
    console.log('服務器端開始監聽!')
    server.close(); // 關閉
});複製代碼

建立HTTP客戶端

http 模塊提供了兩個函數 http.request 和 http.get,功能是做爲客戶端向 HTTP服務器發起請求。

  • http.request(options, callback) 發起 HTTP 請求。接受兩個參數,option 是一個相似關聯數組的對象,表示請求的參數,callback 是請求的回調函數。

let http = require('http');
let options = {
    hostname:'localhost',
    port:4000,
    path: '/',
    method:'get',
    // 告訴服務端我當前要給你發什麼樣的數據
    headers:{
        'Content-Type':'application/x-www-form-urlencoded',
        'Content-Length':17
    }
}
let req = http.request(options);
// 當客戶端收到服務器響應的時候觸發
req.on('response',function(res){
    res.on('data',function(chunk){
        console.log(chunk);
    });
});
req.end('name=renee&&age=18');複製代碼
  • http.get(options, callback) http 模塊還提供了一個更加簡便的方法用於處理GET請求:http.get。它是 http.request 的簡化版,惟一的區別在於http.get自動將請求方法設爲了 GET 請求,同時不須要手動調用 req.end()。

var http = require('http');
​
http.createServer(function(req,res){}).listen(3000);
​
http.get('http://www.baidu.com/index.html',function(res){
    console.log('get response Code :' + res.statusCode);
}).on('error',function(e){
    console.log("Got error: " + e.message);
})複製代碼
相關文章
相關標籤/搜索