亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

nodejs實現套接字服務功能詳解

2019-11-19 13:37:21
字體:
來源:轉載
供稿:網友

本文實例講述了nodejs實現套接字服務功能。分享給大家供大家參考,具體如下:

一、什么是套接字

1. 套接字允許一個進程他通過一個IP地址和端口與另一個進程通信,當你實現對運行在同一臺服務器上的兩個不同進程的進程間通信或訪問一個完全不同的服務器上運行的服務時,套接字很有用。node提供的net模塊,允許你既創建套接字服務器又創建可以連接到套接字服務器的客戶端。

2. 套接字位于HTTP層下面并提供服務器之間的點對點通信。套接字使用套接字地址來工作,這是IP地址和端口的組合。在套接字連接中,有兩種類型的點:一類是服務器,它監聽連接;一類是客戶端,它打開一個到服務器的連接。服務器和客戶端都需要一個唯一的IP地址和端口的組合。

3. 套接字是HTTP模塊的底層結構,如果你不需要處理如get何post的web請求,只需要點對點的傳輸數據,那么使用套接字就可以就能為你提供一個輕量級的解決方案和更多的控制。

二、net.Socket對象

1. Socket對象同時在套接字服務器和客戶端套接字上創建,并允許數據在它們之間來回寫入和讀取。在套接字客戶端,當你調用net.connect()net.createConnection()時,Socket對象在內部創建,這個對象是為了表示到服務器的套接字連接。使用Socket對象來監控連接,將數據發送到服務器并處理來自服務器的響應。在套接字服務器上,當客戶端連接到服務器時,Socket對象被創建,并被傳遞到連接事件處理程序,這個對象是為了表示對客戶端的套接字連接。      在NodeJS中有三種socket:TCP,UDP,Unix域套接字,主要介紹NodeJS中TCP的基本編程知識。

2. 創建一個Socket對象,可以使用以下方法:

//第一種方法,通過一個options參數var SocketClient = net.connect(options, [connectionListener]);var SocketClient = net.createConnection(options, [connectionListener]);//第二種方法,通過接受port和host值作為直接的參數var SocketClient = net.connect(port, [host], [connectionListener]);var SocketClient = net.createConnection(port, [host], [connectionListener]);//第三種方法,通過接受指定文件系統位置的path參數,這個位置是一個Unix套接字在創建Socket對象時使用的。var SocketClient = net.connect(path, [connectionListener]);var SocketClient = net.createConnection(path, [connectionListener]);

無論你使用哪種,都將返回一個Socket對象,唯一的區別在于接受的第一個參數,而最后一個參數都是當連接對服務器打開時執行的回調函數。而無論你使用net.connect還是net.createConncetion,它們的工作方式是完全相同的。

那么至于第一個參數,指定的選項為:

port:客戶端應連接到的端口。此選項是必需的。
host:客戶端應該連接到的服務器的域名或IP地址。默認為localhost
localAddress:客戶端應該綁定的用于網絡連接的本地IP地址。
allowHalfOpen:一個布爾值,如果為true,則表示當套接字的另一端發送一個FIN數據包時,該套接字將不會自動發送一個FIN數據包,從而使Duplex流的一半保持開放。默認為false

3. 一旦Socket對象被創建,它就提供了在連接到服務器的生命周期中發出的幾個事件,如下:

connect:成功建立與服務器的連接時發出?;卣{函數不接受任何參數
data:在套接字上收到數據時發出。如果沒有數據時間處理程序被連接,那么數據可能會丟失?;卣{函數必須接受一個buffer對象作為參數,它包含從套接字讀取的數據的塊。
end:當服務器通過發送一個FIN終止連接時發出?;卣{函數不接受任何參數
timeout:由于不活動,因此到服務器的連接超時時發出。
drain:當寫緩沖區變為空時發出。你可以使用此事件截回被寫入套接字中的數據流?;卣{函數不接受任何參數
error:在套接字連接上發生錯誤時發出?;卣{函數應該接受錯誤的唯一參數。
close:套接字已完全關閉時發出,它可能是由一個end()方法關閉的,或者因為發生錯誤而關閉?;卣{函數不接受任何參數

4. Socket對象還提供了可以訪問以獲得該對象的信息的幾個屬性:

bufferSize   當前已緩沖并等待寫入套接字的流中的字節數
remoteAddress   套接字連接到的遠程服務器的IP地址
remotePort    套接字連接到的遠程服務器的端口
localAddress   遠程客戶端用于套接字連接的本地IP地址
localPort     遠程客戶端用于套接字連接的本地端口
byteRead     由套接字讀取的字節數
byteWritten    由套接字寫入的字節數

三、net.Server對象

可以使用net.Server對象創建一個TCP套接字服務器,并監聽對它的連接,你將能夠讀取和寫入數據。

要創建一個服務器獨享,使用net.createServer()方法:

net.createServer([options],[connectListener])

其中,options是一個對象,指定創建套接字Server對象時要使用的選項,如allowHalfOpen,可以使一半的Duplex流保持開放,默認為false。connectLlistenerconnection事件的回調函數,它在接收到連接時被執行。

舉例:

var net = require('net');var HOST = '127.0.0.1';var PORT = 6969;// 創建一個TCP服務器實例,調用listen函數開始監聽指定端口// 傳入net.createServer()的回調函數將作為”connection“事件的處理函數// 在每一個“connection”事件中,該回調函數接收到的socket對象是唯一的net.createServer(function(sock) {  // 我們獲得一個連接 - 該連接自動關聯一個socket對象  console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);  // 為這個socket實例添加一個"data"事件處理函數  sock.on('data', function(data) {    console.log('DATA ' + sock.remoteAddress + ': ' + data);    // 回發該數據,客戶端將收到來自服務端的數據    sock.write('You said "' + data + '"');  });  // 為這個socket實例添加一個"close"事件處理函數  sock.on('close', function(data) {    console.log('CLOSED: ' +      sock.remoteAddress + ' ' + sock.remotePort);  });}).listen(PORT, HOST);console.log('Server listening on ' + HOST +':'+ PORT);

服務端也可以用稍不同的方式接受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);  // 其它內容與前例相同});

上述兩個例子只是寫法不同,并無本質區別。

創建TCP客戶端

現在讓我們創建一個TCP客戶端連接到剛創建的服務器上,該客戶端向服務器發送一串消息,并在得到服務器的反饋后關閉連接。下面的代碼描述了這一過程。

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);  // 建立連接后立即向服務器發送數據,服務器將收到這些數據  client.write('I am Chuck Norris!');});// 為客戶端添加“data”事件處理函數// data是服務器發回的數據client.on('data', function(data) {  console.log('DATA: ' + data);  // 完全關閉連接  client.destroy();});// 為客戶端添加“close”事件處理函數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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产做受69高潮| 高清在线视频日韩欧美| 日本免费在线精品| 午夜精品久久久久久久白皮肤| 亚洲va国产va天堂va久久| 69视频在线播放| 欧美影院久久久| 欧美日韩国产在线| 久久精品这里热有精品| 久久久国产精彩视频美女艺术照福利| 亚洲国产精品久久久久| 亚洲国产精品久久久久秋霞蜜臀| 欧美日韩综合视频网址| 成人av.网址在线网站| 97婷婷涩涩精品一区| 久久久伊人日本| 久久久久久噜噜噜久久久精品| 丝袜美腿亚洲一区二区| 欧美亚洲午夜视频在线观看| 久久成年人免费电影| 亚洲日本欧美日韩高观看| 久久91超碰青草是什么| 3344国产精品免费看| 欧美电影免费观看电视剧大全| 成人免费在线视频网站| 91精品国产综合久久男男| 国产精品自拍偷拍| 国产精品综合网站| 激情成人中文字幕| 欧美精品成人在线| 欧美国产日韩一区| 国产精品极品美女在线观看免费| 中文字幕九色91在线| 国产精品第一区| 插插插亚洲综合网| 2021久久精品国产99国产精品| 亚洲精品小视频在线观看| 91视频国产高清| 国产精品第8页| 国产精品2018| 久久久中文字幕| 成人av在线亚洲| 日本最新高清不卡中文字幕| 欧美久久精品午夜青青大伊人| 中文字幕自拍vr一区二区三区| 91欧美精品成人综合在线观看| 久久精品亚洲94久久精品| 日韩一区二区三区xxxx| 国产精品中文字幕久久久| 韩曰欧美视频免费观看| 欧美性高潮在线| 97精品国产97久久久久久免费| 日本中文字幕成人| 欧美激情视频一区二区| 亚洲精品ady| 欧美激情一区二区久久久| 久久人体大胆视频| 亚洲摸下面视频| 91精品国产高清| 欧美极品少妇xxxxⅹ喷水| 992tv成人免费视频| 欧美韩国理论所午夜片917电影| 国产欧美一区二区三区久久| 国产精品扒开腿爽爽爽视频| 8x海外华人永久免费日韩内陆视频| 尤物九九久久国产精品的分类| 亚洲va国产va天堂va久久| 精品av在线播放| 国产精品偷伦免费视频观看的| 亚洲第一天堂无码专区| 欧美成人午夜影院| 日韩在线观看免费高清| 久久久久久网址| 中文字幕在线看视频国产欧美| 国产精品老牛影院在线观看| 日韩最新在线视频| 成人激情黄色网| 久久久精品视频成人| 欧美日韩国产成人在线观看| 91高潮精品免费porn| 亚洲国产精品va在线| 日韩人体视频一二区| 国产精品一香蕉国产线看观看| 欧美一区二粉嫩精品国产一线天| 亚洲最大福利视频| 欧美成人手机在线| 欧美日韩午夜视频在线观看| 亚洲精品欧美极品| 成人午夜高潮视频| 5566日本婷婷色中文字幕97| 色悠悠国产精品| 免费99精品国产自在在线| 青草青草久热精品视频在线观看| 国产精品444| 日韩毛片在线观看| 日韩经典中文字幕| 国产一区二区精品丝袜| 2019亚洲日韩新视频| 成人a在线视频| 久久久国产视频91| 91高清视频免费观看| 久久中文久久字幕| 尤物九九久久国产精品的分类| 亚洲国产天堂久久综合网| 最近2019好看的中文字幕免费| 97人洗澡人人免费公开视频碰碰碰| 久久99精品久久久久久琪琪| 亚洲午夜精品久久久久久性色| 俺去啦;欧美日韩| 久久久久久国产精品| 日韩美女av在线免费观看| 久久久久久久爱| 美日韩精品免费视频| 久久久免费观看| 日韩视频免费在线观看| 国产高清视频一区三区| 欧美大全免费观看电视剧大泉洋| 91chinesevideo永久地址| 国产美女久久久| 欧美成年人视频网站欧美| 91精品国产综合久久久久久久久| 亚洲最大福利视频| 国产精品久久久999| 久久视频在线看| 亚洲免费成人av电影| 国产一区二区三区视频在线观看| 国产成人免费av电影| 色噜噜国产精品视频一区二区| 国产免费观看久久黄| 精品欧美国产一区二区三区| 国产一区二区三区四区福利| 97超级碰碰碰久久久| 国产精品www色诱视频| 不用播放器成人网| 欧美乱大交做爰xxxⅹ性3| 浅井舞香一区二区| 久热在线中文字幕色999舞| 一区国产精品视频| 日本道色综合久久影院| 国产欧美一区二区三区在线看| 欧美性受xxxx白人性爽| 国产精品久久久久久久久久| 色一区av在线| 在线免费看av不卡| 亚洲电影av在线| 欧美—级a级欧美特级ar全黄| 国产精品对白刺激| 日韩高清免费在线| 亚洲最大成人免费视频| 日韩精品中文在线观看| 欧美日韩国产成人| 国产精品综合网站| 亚洲成人激情小说| 精品国产乱码久久久久久虫虫漫画| 中文字幕不卡在线视频极品| 国产成人亚洲综合| 亚洲第一男人天堂| 国产精品电影在线观看| 日韩av手机在线观看| 亚洲成人免费在线视频| 欧美在线观看一区二区三区| 97涩涩爰在线观看亚洲| 欧美电影在线观看| 国产成人精品久久二区二区91|