這篇文章主要介紹了nodejs怎么實現(xiàn)套接字服務(wù)功能,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
我們一直強調(diào)成都網(wǎng)站設(shè)計、做網(wǎng)站對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)的建站公司不一定是大公司,創(chuàng)新互聯(lián)公司作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
JS是JavaScript的簡稱,它是一種直譯式的腳本語言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,主要用于web的開發(fā),可以給網(wǎng)站添加各種各樣的動態(tài)效果,讓網(wǎng)頁更加美觀。
一、什么是套接字
1. 套接字允許一個進程他通過一個IP地址和端口與另一個進程通信,當你實現(xiàn)對運行在同一臺服務(wù)器上的兩個不同進程的進程間通信或訪問一個完全不同的服務(wù)器上運行的服務(wù)時,套接字很有用。node提供的net模塊,允許你既創(chuàng)建套接字服務(wù)器又創(chuàng)建可以連接到套接字服務(wù)器的客戶端。
2. 套接字位于HTTP層下面并提供服務(wù)器之間的點對點通信。套接字使用套接字地址來工作,這是IP地址和端口的組合。在套接字連接中,有兩種類型的點:一類是服務(wù)器,它監(jiān)聽連接;一類是客戶端,它打開一個到服務(wù)器的連接。服務(wù)器和客戶端都需要一個唯一的IP地址和端口的組合。
3. 套接字是HTTP模塊的底層結(jié)構(gòu),如果你不需要處理如get何post的web請求,只需要點對點的傳輸數(shù)據(jù),那么使用套接字就可以就能為你提供一個輕量級的解決方案和更多的控制。
二、net.Socket對象
1. Socket對象同時在套接字服務(wù)器和客戶端套接字上創(chuàng)建,并允許數(shù)據(jù)在它們之間來回寫入和讀取。在套接字客戶端,當你調(diào)用net.connect()
或net.createConnection()
時,Socket對象在內(nèi)部創(chuàng)建,這個對象是為了表示到服務(wù)器的套接字連接。使用Socket對象來監(jiān)控連接,將數(shù)據(jù)發(fā)送到服務(wù)器并處理來自服務(wù)器的響應。在套接字服務(wù)器上,當客戶端連接到服務(wù)器時,Socket對象被創(chuàng)建,并被傳遞到連接事件處理程序,這個對象是為了表示對客戶端的套接字連接。 在NodeJS中有三種socket:TCP,UDP,Unix域套接字,主要介紹NodeJS中TCP的基本編程知識。
2. 創(chuàng)建一個Socket對象,可以使用以下方法:
//第一種方法,通過一個options參數(shù) var SocketClient = net.connect(options, [connectionListener]); var SocketClient = net.createConnection(options, [connectionListener]); //第二種方法,通過接受port和host值作為直接的參數(shù) var SocketClient = net.connect(port, [host], [connectionListener]); var SocketClient = net.createConnection(port, [host], [connectionListener]); //第三種方法,通過接受指定文件系統(tǒng)位置的path參數(shù),這個位置是一個Unix套接字在創(chuàng)建Socket對象時使用的。 var SocketClient = net.connect(path, [connectionListener]); var SocketClient = net.createConnection(path, [connectionListener]);
無論你使用哪種,都將返回一個Socket對象,唯一的區(qū)別在于接受的第一個參數(shù),而最后一個參數(shù)都是當連接對服務(wù)器打開時執(zhí)行的回調(diào)函數(shù)。而無論你使用net.connect
還是net.createConncetion
,它們的工作方式是完全相同的。
那么至于第一個參數(shù),指定的選項為:
port:客戶端應連接到的端口。此選項是必需的。
host:客戶端應該連接到的服務(wù)器的域名或IP地址。默認為localhost
localAddress:客戶端應該綁定的用于網(wǎng)絡(luò)連接的本地IP地址。
allowHalfOpen:一個布爾值,如果為true,則表示當套接字的另一端發(fā)送一個FIN數(shù)據(jù)包時,該套接字將不會自動發(fā)送一個FIN數(shù)據(jù)包,從而使Duplex流的一半保持開放。默認為false
3. 一旦Socket對象被創(chuàng)建,它就提供了在連接到服務(wù)器的生命周期中發(fā)出的幾個事件,如下:
connect:成功建立與服務(wù)器的連接時發(fā)出。回調(diào)函數(shù)不接受任何參數(shù)
data:在套接字上收到數(shù)據(jù)時發(fā)出。如果沒有數(shù)據(jù)時間處理程序被連接,那么數(shù)據(jù)可能會丟失?;卣{(diào)函數(shù)必須接受一個buffer對象作為參數(shù),它包含從套接字讀取的數(shù)據(jù)的塊。
end:當服務(wù)器通過發(fā)送一個FIN終止連接時發(fā)出?;卣{(diào)函數(shù)不接受任何參數(shù)
timeout:由于不活動,因此到服務(wù)器的連接超時時發(fā)出。
drain:當寫緩沖區(qū)變?yōu)榭諘r發(fā)出。你可以使用此事件截回被寫入套接字中的數(shù)據(jù)流?;卣{(diào)函數(shù)不接受任何參數(shù)
error:在套接字連接上發(fā)生錯誤時發(fā)出?;卣{(diào)函數(shù)應該接受錯誤的唯一參數(shù)。
close:套接字已完全關(guān)閉時發(fā)出,它可能是由一個end()方法關(guān)閉的,或者因為發(fā)生錯誤而關(guān)閉?;卣{(diào)函數(shù)不接受任何參數(shù)
4. Socket對象還提供了可以訪問以獲得該對象的信息的幾個屬性:
bufferSize 當前已緩沖并等待寫入套接字的流中的字節(jié)數(shù)
remoteAddress 套接字連接到的遠程服務(wù)器的IP地址
remotePort 套接字連接到的遠程服務(wù)器的端口
localAddress 遠程客戶端用于套接字連接的本地IP地址
localPort 遠程客戶端用于套接字連接的本地端口
byteRead 由套接字讀取的字節(jié)數(shù)
byteWritten 由套接字寫入的字節(jié)數(shù)
三、net.Server對象
可以使用net.Server對象創(chuàng)建一個TCP套接字服務(wù)器,并監(jiān)聽對它的連接,你將能夠讀取和寫入數(shù)據(jù)。
要創(chuàng)建一個服務(wù)器獨享,使用net.createServer()
方法:
net.createServer([options],[connectListener])
其中,options是一個對象,指定創(chuàng)建套接字Server對象時要使用的選項,如allowHalfOpen,可以使一半的Duplex流保持開放,默認為false。connectLlistener
是connection
事件的回調(diào)函數(shù),它在接收到連接時被執(zhí)行。
舉例:
var net = require('net'); var HOST = '127.0.0.1'; var PORT = 6969; // 創(chuàng)建一個TCP服務(wù)器實例,調(diào)用listen函數(shù)開始監(jiān)聽指定端口 // 傳入net.createServer()的回調(diào)函數(shù)將作為”connection“事件的處理函數(shù) // 在每一個“connection”事件中,該回調(diào)函數(shù)接收到的socket對象是唯一的 net.createServer(function(sock) { // 我們獲得一個連接 - 該連接自動關(guān)聯(lián)一個socket對象 console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort); // 為這個socket實例添加一個"data"事件處理函數(shù) sock.on('data', function(data) { console.log('DATA ' + sock.remoteAddress + ': ' + data); // 回發(fā)該數(shù)據(jù),客戶端將收到來自服務(wù)端的數(shù)據(jù) sock.write('You said "' + data + '"'); }); // 為這個socket實例添加一個"close"事件處理函數(shù) sock.on('close', function(data) { console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort); }); }).listen(PORT, HOST); console.log('Server listening on ' + HOST +':'+ PORT);
服務(wù)端也可以用稍不同的方式接受TCP連接,即顯式處理"connection"事件:
var server = net.createServer(); server.listen(PORT, HOST); console.log('Server listening on ' + server.address().address + ':' + server.address().port); server.on('connection', function(sock) { console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort); // 其它內(nèi)容與前例相同 });
上述兩個例子只是寫法不同,并無本質(zhì)區(qū)別。
創(chuàng)建TCP客戶端
現(xiàn)在讓我們創(chuàng)建一個TCP客戶端連接到剛創(chuàng)建的服務(wù)器上,該客戶端向服務(wù)器發(fā)送一串消息,并在得到服務(wù)器的反饋后關(guān)閉連接。下面的代碼描述了這一過程。
var net = require('net'); var HOST = '127.0.0.1'; var PORT = 6969; var client = new net.Socket(); client.connect(PORT, HOST, function() { console.log('CONNECTED TO: ' + HOST + ':' + PORT); // 建立連接后立即向服務(wù)器發(fā)送數(shù)據(jù),服務(wù)器將收到這些數(shù)據(jù) client.write('I am Chuck Norris!'); }); // 為客戶端添加“data”事件處理函數(shù) // data是服務(wù)器發(fā)回的數(shù)據(jù) client.on('data', function(data) { console.log('DATA: ' + data); // 完全關(guān)閉連接 client.destroy(); }); // 為客戶端添加“close”事件處理函數(shù) client.on('close', function() { console.log('Connection closed'); });
再舉個例子:
var net=require('net'); function getConnection(connName){ var client=net.connect({port:8017,host:'127.0.0.1'},function(){ console.log(connName+' connected: '); console.log(' local=%s:%s',this.localAddress,this.localPort); console.log( ' remote=%s:%s',this.remoteAddress,this.remotePort); this.setTimeout(500); this.setEncoding('utf8'); this.on('data',function(data){ console.log(connName+' From Server: '+data.toString()); this.end(); }); this.on('end',function(){ console.log(connName+' Client disnected'); }); this.on('error',function(err){ console.log('Socket Error: ',JSON.stringify(err)); }); this.on('timeout',function(){ console.log('Socket Time Out'); }); this.on('close',function(){ console.log('Socket Closed'); }); }); return client; } function writeData(socket,data){ var success=!socket.write(data); if(!success){ (function (socket,data){ socket.once('drain',function(){ writeData(socket,data); }); })(socket,data); } } var example1=getConnection('example1'); var example2=getConnection('example2'); writeData(example1,'This is example1'); writeData(example2,'This is example2'); var server=net.createServer(function(client){ console.log('Client connection: '); console.log(' local=%s:%s',client.localAddress,client.localPort); console.log( ' remote=%s:%s',client.remoteAddress,client.remotePort); client.setTimeout(500); client.setEncoding('utf8'); client.on('data',function(data){ console.log('Received data from client on port %d:%s',client.remotePort,data.toString()); console.log(' Bytes received:'+data.toString()); writeData(client,'Sending: '+data.toString()); console.log(' Bytes sent: '+client.bytesWritten) }); client.on('end',function(){ console.log('Client disconnected'); server.getConnections(function(err,count){ console.log('Remaining Connections: '+count); }); }); client.on('error',function(err){ console.log('Socket Error: '+JSON.stringify(err)); }); client.on('timeout',function(){ console.log('Socket Time Out'); }); }); server.listen(8017,function(){ console.log('Server listening: '+JSON.stringify(server.address())); server.on('close',function(){ console.log('Server Terminated'); }); server.on('error',function(err){ console.log('Server Error: ',JSON.stringify(err)); }); });
感謝你能夠認真閱讀完這篇文章,希望小編分享的“nodejs怎么實現(xiàn)套接字服務(wù)功能”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!
當前名稱:nodejs怎么實現(xiàn)套接字服務(wù)功能
標題鏈接:http://bm7419.com/article42/gosjhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導航、全網(wǎng)營銷推廣、定制網(wǎng)站、網(wǎng)站設(shè)計公司、網(wǎng)站建設(shè)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)