TCP是用來計算機之間進行通訊的,經過編寫客戶端和服務端聊天的代碼,對於服務器與客戶端的工做步驟有了深入的瞭解。在node中爲了實現TCP,提供了一個net
模塊,net
模塊給你提供了一個異步的網絡封裝,它包含建立服務器和客戶端(稱爲流)的功能。html
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();複製代碼
監聽客戶輸入時,將客戶端輸入的內容寫入到文件內容。
若是有兩個客戶端,就有兩個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事件,只有當全部客戶端都關閉了,服務端才關閉,若是有人進來(有新請求)仍然能夠。
net.createConnection 是用來建立於服務端的鏈接
let net = require('net');
let socket = net.createConnection({port:8080},function(){
socket.write('hello');
socket.on('data',function(data){
console.log(data);
});
});複製代碼
node中爲了實現http一樣也提供了一個模塊,叫http模塊,其中封裝了高效的http服務器和http客戶端 ,與net模塊用法類似。
request
當客戶端請求到來的時候,該事件被觸發。
咱們最經常使用的仍是request
事件,http也給這個事件提供了一個捷徑:http.createServer([requestListener])
。
參數res req
傳入中的參數req是請求,是一個可讀流,res是響應 是一個可寫流。是經過socket解析出來請求和響應。
建立HTTP服務器有兩種方法
第一種
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);複製代碼
能夠這樣簡寫
let http = require('http');
let server = http.createServer(function(req,res){
res.end('ok');
});
server.listen(8080);複製代碼
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.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);
})複製代碼