nodejs 實現通訊端服務

來源:互聯網
上載者:User

標籤:size   不同的   png   des   回寫   strong   return   關聯   creates   

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地址。預設為localhostlocalAddress:用戶端應該綁定的用於網路連接的本地IP地址。allowHalfOpen:一個布爾值,如果為true,則表示當通訊端的另一端發送一個FIN資料包時,該通訊端將不會自動發送一個FIN資料包,從而使Duplex流的一半保持開放。預設為false 3.一旦Socket對象被建立,它就提供了在串連到伺服器的生命週期中發出的幾個事件,如下:connect:成功建立與伺服器的串連時發出。回呼函數不接受任何參數data:在通訊端上收到資料時發出。如果沒有資料時間處理常式被串連,那麼資料可能會丟失。回呼函數必須接受一個buffer對象作為參數,它包含從通訊端讀取的資料的塊。end:當伺服器通過發送一個FIN終止串連時發出。回呼函數不接受任何參數timeout:由於不活動,因此到伺服器的連線逾時時發出。drain:當寫緩衝區變為空白時發出。你可以使用此事件截回被寫入通訊端中的資料流。回呼函數不接受任何參數error:在通訊端串連上發生錯誤時發出。回呼函數應該接受錯誤的唯一參數。close:通訊端已完全關閉時發出,它可能是由一個end()方法關閉的,或者因為發生錯誤而關閉。回呼函數不接受任何參數 5.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。connectLlistener是connection事件的回呼函數,它在接收到串連時被執行。 舉例:
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 實現通訊端服務

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.