摘要:創建服務器方法返回被創建的服務器參數參數值為一個對象可以在給兌現各種使用一個布爾類型的屬性當為時當服務器接收到客戶端發送的一個包時將會回發一個包當為時服務器接收到客戶端發送的包時不回發包這使得服務器可以繼續向客戶端發送數據但是不會繼續接收客
1.創建TCP服務器
let server = net.createServer([options], [connectionListener]);
createServer方法返回被創建的TCP服務器
options參數
options參數值為一個對象,可以在給兌現各種使用一個布爾類型的allowHalfOpen屬性,當為false時,當TCP服務器接收到客戶端發送的一個FIN包時將會回發一個FIN包.當為true時,TCP服務器接收到客戶端發送的FIN包時不回發FIN包,這使得TCP服務器可以繼續向客戶端發送數據,但是不會繼續接收客戶端發送的數據,必須調用end方法來關閉該socket連接.
connectionListener參數用于指定客戶端與服務器端建立起來時所要調用的回調函數.
const net = require("net"); let server = net.createServer(false, function (socket) {});2. 建立連接
當客戶端與服務器建立連接時,觸發connection事件,我們可以通過對connection事件進行監聽,并且指定該事件的返回函數的方法來指定當客戶端與服務器建立連接時所需要執行的處理
server.on("connection", function(socket){})
回調函數中的參數為該TCP服務器監聽的socktet端口對象
在創建了TCP服務器之后,可以用listen方法通知服務器開始監聽客戶端連接,有三種指定的方法
2.1 listen方法一:server.listen(port, [host], [backlog], [callback]);
port為必須要指定的參數,為0時將為TCP分配一個隨機端口號.
host為指定需要監聽的IP地址或主機名,如果省略,服務器將錦亭來自任何IPv4地址的客戶端連接
backlog為一個整數值,用于指定位于等待隊列中的客戶端連接的最大數量,一旦超過這個長度,TCP服務器將開始拒絕來自新的客戶端的連接請求,參數值默認為511
當對TCP服務器制定了需要監聽的地址和端口后,服務器將立即開始監聽來自于該地址及端口的客戶端連接,這時觸發該服務器的listening事件,可使用listen方法的callback參數來指定listening事件觸發時調用的回調函數,該回調函數中不使用任何參數
2.2 listen方法二:server.listen(path, [callback]);
這種形式的listen方法用于通知一個使用unix端口的服務器開始監聽來自于路徑的客戶端連接.
path為指定的需要監聽的路徑,當對使用unix端口的服務器指定了需要監聽的路徑后,服務器將立即開始監聽來自于該路徑的客戶端連接.
這時觸發該服務器的listening事件,可以使用listen方法的callback參數來指定listening事件觸發時調用的回調函數,該回調函數不需要使用任何參數.
2.3 listen方法三:server.listen(handle, [callback]);
這種形式的listen方法用于通知一個TCP服務器開始監聽一個指定socket句柄的客戶端來接該方法使用兩個參數
(該句柄可以為一個TCP服務器對象,也可以為一個文件描述符,在WINDOWS操作系統中不支持對文件描述符的監聽)
第一個參數用于執行需要監聽的socket句柄.當對TCP服務器指定了需要監聽的socket句柄后,服務器端將立即開始監聽來自于該socket句柄的客戶端連接,這時觸發該服務器的listening事件
可以使用listen方法的callback參數來指定listening事件觸發時調用的回調函數,該回調函數不需要任何參數.
如果不在上述三種形式的listen方法中使用callback參數,可以通過監聽TCP服務器對象的listening事件,并且指定該事件觸發時調用的回調函數的方法來指定TCP服務器開始監聽時所需要執行的處理server.on("listening", function(){})
3. error對TCP服務器指定需要監聽的地址及端口時,如果該地址及端口已經被占用,將產生一個錯誤代碼為EADDRINUSE的錯誤(表示用于監聽的地址和端口被占用),同是將觸發TCP服務器一個error事件,可以通過對error事件設置回調函數的方法指定該錯誤產生時需要執行的處理.
const net = require("net"); let server = net.createServer(false, function (socket) { // 這里的socket參數就是一個socket對象 }); server.on("error", function (e) { if (e.code === "EADDRINUSE") { console.log("該地址及端口被占用,請修正") } });4. address
創建了TCP服務器之后,可以是使用TCP服務器的address方法來查看該服務器所監聽的地址信息
let address = server.address();
該方法返回一個對象,其中具有以下的屬性
port:TCP服務器監聽的socket端口號
address:TCP服務器監聽的地址,如127.0.0.1
family:一個標識了TCP服務器所監聽的地址的是IPv4地址還是IPv6地址的字符串,例如IPv4
使用TCP服務器的getConnections方法查看當前與TCP服務器建立連接的客戶端連接數量server.getConnections(callback(err, count))
TCP服務器server對象的maxConnections屬性將TCP對象的最大連接數設置為2,同時在控制臺中輸出設置后的maxConnections屬性值,當當前客戶端與服務器連接數等于該值時,不再接受新的客戶端連接請求.
5. close每當有客戶端與服務器端建立連接后,第一個命令行窗口中都將顯示當前存在的客戶端與TCP服務器之間的連接數量.
在一個新的命令行窗口中建立與被創建的TCP服務器之間的連接,TCP服務器將不再接收該連接,第一個命令行窗口中不會有任何變化.
可以使用TCP服務器的close方法顯式指定服務器拒絕所有新的客戶端連接
server.close([callback()])
在使用close方法時,并不會斷開所有現存的客戶端連接.當這些客戶端連接被關閉時,TCP服務器將會自動關閉,同時觸發TCP服務器的close事件,close的回調函數是否有參數都可以.
6. socket端口對象在Node.js中,使用net.Socket代表一個socket端口對象,在使用createServer方法的connectionListener參數所指定的回調函數(當客戶端與服務器端建立連接時調用)的參數值,即為一個被自動創建的net.Socket對象(代表的服務器所監聽的端口對象),在對TCP服務器所指定的connection事件回調函數的參數值同樣為一個被自動創建的net.Socket對象(代表TCP服務器所監聽的端口對象)
與TCP服務器獨享的address方法相類似,可以利用socket端口對象的address方法獲取該socket端口對象相關的地址信息
let address = socket.address();
該方法返回一個對象,其中具有以下的屬性
port:TCP服務器監聽的socket端口號
address:TCP服務器監聽的地址,如127.0.0.1
family:一個標識了TCP服務器所監聽的地址的是IPv4地址還是IPv6地址的字符串,例如IPv4
socket端口對象可被用來讀取客戶端發送的流數據,每次接收到客戶端發送的流數據時觸發data事件,可通過對該事件進行監聽并且指定回調函數的方法來指定當服務器端監聽的socket端口對象接收到客戶端發送的數據時所需要執行的處理.
socket.on("data", function (data) {});
在該回調函數中,使用給一個參數,參數值為一個Buffer對象(在未使用socket端口對象的setEncoding方法指定編碼時)或者一個字符串對象(在使用socket端口對象的setEncoding方法指定編碼方式后)
data獲取到的是一個存放了服務到的數據的緩存區對象,如果我們在對data事件進行監聽之后使用編碼格式,將在控制臺中以字符串形式輸出讀取到的數據.
const net = require("net"); let server = net.createServer(false, function (socket) { socket.setEncoding("utf8"); socket.on("data", function (data) { console.log(data); }); });6.2 方法二:
const net = require("net"); let server = net.createServer(false, function (socket) { socket.on("data", function (data) { console.log(data.toString()); }); });7. pipe
可以通過socket對象的pipe方法將客戶端發送的流數據寫到文件等其他目標對象中
socket.pipe(destination, [options]);
destination參數為必須輸入參數,options參數為可選參數.destination參數值必須為一個可用于寫入流數據的對象.options參數值為一個對象,可以在該對象中使用一個布爾類型的end屬性,如果該屬性值為true,則當數據全被讀取完畢時立即結束寫操作,如果該屬性值為false,目標對象中可以被繼續寫入新的數據,該屬性的默認值為true;
const net = require("net"); let file = require("fs").createWriteStream("./message.txt"); let server = net.createServer(); server.on("connection", function (socket) { socket.pipe(file, { end: false }); socket.on("end", function () { file.end("byebye"); }); }); server.listen(9999, "localhost");
使用unpipe方法取消目標對象的寫入操作
socket.unpipe([destination]);8. pause
可以使用socket端口對象的pause方法暫停data事件的觸發,這時服務器端將把每一個客戶端發送的數據暫存在一個多帶帶的緩存區中.
socket.pause();
在使用了pause方法暫停data事件的觸發后,可以使用socket端口對象的resume方法恢復data事件的觸發,這時將讀取被緩存的該客戶端的數據.
socket.resume();
通過監聽socket端口對象的timeout事件并且指定該事件回調函數的方法來指定當客戶端連接超時時所需要執行的處理
const net = require("net"); let server = net.createServer(); server.on("connection", function (socket) { socket.setTimeout(10 * 1000); socket.pause(); socket.on("timeout", function () { socket.resume(); socket.pipe(file); }); socket.on("data", function (data) { socket.pause(); }); });10. 一個基本的TCP服務器
const net = require("net"); let server = net.createServer(function (socket) { console.log(socket); let address = socket.address(); console.log("socket端口對象的地址信息為%j", address); // socket端口對象的地址信息為{"address":"127.0.0.1","family":"IPv4","port":2596} socket.setEncoding("utf8"); socket.on("data", function (data) { console.log(data); console.log("已接收到的字節數據長度", socket.bytesRead); /** * GET / HTTP/1.1 * User-Agent: curl/7.29.0 * Host: localhost:2596 * Accept: // 屬性值為"星號斜線星號",因為會與注釋沖突,所以沒寫 * * * 已接收到的字節數據長度 78 * */ }); // 可以通過socket對象的pipe方法將客戶端發送的流數據寫到文件等其他目標對象中 socket.pipe(file); socket.on("end", function () { console.log("客戶端連接已關閉"); // 當客戶端連接關閉時,輸出"客戶端連接已關閉" }) }); server.getConnections(function (err, count) { console.log("當前存在" + count + "個客戶端連接"); server.maxConnections = 2;// 設置最大連接為2 console.log("客戶端與服務器端已建立連接"); }); server.close(function () { console.log("TCP服務器被關閉"); }); server.on("error", function (e) { if (e.code === "EADDRINUSE") { console.log("該地址及端口被占用,請修正") } }); let address = server.address(); server.listen(2596, "localhost", 256, function () { console.log("服務器開始監聽"); });
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92891.html
摘要:創建客戶端對象與服務器的參數屬性一樣此時端口有下邊的幾個屬性連接另一端所使用的遠程地址連接另一端所使用的端口號本地用于建立連接的地址本地用于建立連接的端口號端口對象可以被用來寫入向客戶端或服務器端發送的流數據當流數據被寫入后將立即發送到客戶 1. 創建TCP客戶端 const net = require(net); let socket = new net.Socket([option...
摘要:然而,在處理流或文件流時,必須要處理二進制數據。因此,在中,定義了一個類,該類用來創建一個專門存放二進制數據的緩存區。因為在計算字符串的長度時,以位子作為一個單位,而在計算緩存區的長度時,以字節作為一個單位。 buffer對象 1. 什么是buffer 在客戶端Javascript腳本代碼中,對于二進制數據沒有提供一個很好的支持。然而,在處理TCP流或文件流時,必須要處理二進制數據...
摘要:下文如無特殊聲明將使用進程同時表示進程線程。收到數據后服務器程序進行處理然后使用向客戶端發送響應。現在各種高并發異步的服務器程序都是基于實現的,比如。 并發 IO 問題一直是服務器端編程中的技術難題,從最早的同步阻塞直接 Fork 進程,到 Worker 進程池/線程池,到現在的異步IO、協程。PHP 程序員因為有強大的 LAMP 框架,對這類底層方面的知識知之甚少,本文目的就是詳細介...
摘要:域套接字使用或指定請求方法的字符串。請求路徑包含非法字符時拋出異常。保持資源池周圍的套接字在未來被用于其它請求。默認值為當使用的時候,通過正在保持活動的套接字發送包的頻繁程度。 文章來源:小青年原創發布時間:2016-09-29關鍵詞:JavaScript,nodejs,http,url ,Query String,爬蟲轉載需標注本文原始地址: http://zhaomenghuan....
閱讀 3245·2023-04-26 01:31
閱讀 1892·2023-04-25 22:08
閱讀 3430·2021-09-01 11:42
閱讀 2823·2019-08-30 12:58
閱讀 2165·2019-08-29 18:31
閱讀 2429·2019-08-29 17:18
閱讀 3064·2019-08-29 13:01
閱讀 2552·2019-08-28 18:22