Node.js開發(fā)之套接字(socket)編程入門示例
本文實(shí)例講述了Node.js套接字(socket)編程。分享給大家供大家參考,具體如下:
Node.js的net模塊提供了socket編程接口,方便我們利用較為底層的套接字接口來實(shí)現(xiàn)應(yīng)用協(xié)議。這次我們看一個簡單的回顯服務(wù)器示例,包括服務(wù)端和客戶端的代碼。
代碼
分服務(wù)器和客戶端兩部分來說吧。
server代碼分析
server.js:
var net = require("net"); // server is an instance of net.Server // sock is an instance of net.Socket var server = net.createServer(function(sock){ console.log('client connected, address - ', sock.remoteAddress, ' port - ', sock.remotePort); sock.setEncoding('utf8'); sock.on('data', function(data){ console.log('got data from client - ', data); sock.write(data); }); sock.on('end', function(){ console.log('client disconnected'); }); sock.on('error', function(err){ console.log('socket error - ', err); }); }); server.maxConnections = 10; server.listen(7, function(){ console.log('echo server bound at port - 7'); });
使用net.createServer來創(chuàng)建一個服務(wù)器實(shí)例,這個方法的返回值是一個net.Server實(shí)例,net.Server提供了listen方法,讓我們監(jiān)聽到某個端口上來接受客戶端連接,同時(shí)還提供了一些屬性,比如maxConnections可以設(shè)置服務(wù)器的并發(fā)連接數(shù)上限(當(dāng)服務(wù)器的連接數(shù)超過這個值時(shí),后續(xù)連接就會被拒掉),還有其它的,看文檔吧:https://nodejs.org/api/net.html#net_class_net_server。
net.Server還提供了一些事件,比如error、connection等。當(dāng)有客戶端連接被接受時(shí),會發(fā)射connection事件,這個事件帶一個net.Socket對象作為參數(shù),可以在回調(diào)函數(shù)里訪問這個net.Socket實(shí)例來與客戶端交互。我在代碼里,給createServer方法傳入了一個callback來處理connection事件,實(shí)際上也可以略作修改,通過監(jiān)聽connection事件的方法處理客戶端連接。新代碼如下:
var net = require("net"); var server = net.createServer(); server.on('connection', function(sock){ console.log('client connected, address - ', sock.remoteAddress, ' port - ', sock.remotePort); sock.setEncoding('utf8'); sock.on('data', function(data){ console.log('got data from client - ', data); sock.write(data); }); sock.on('end', function(){ console.log('client disconnected'); }); sock.on('error', function(err){ console.log('socket error - ', err); }); }); server.maxConnections = 10; server.listen(7, function(){ console.log('echo server bound at port - 7'); });
效果是一樣的。
net.Socket對象有一些方法,比如write可以寫數(shù)據(jù)。還有一些事件,比如error、end、data等,看代碼就能明白用法。還有一些屬性,比如remoteAddress、remotePort。
client代碼分析
client.js:
var net = require("net"); var readline = require('readline'); console.log('type "exit" or "quit" to quit.'); // sock is an instance of net.Socket var sock = net.connect({port: 7}, function(){ console.log('server connected'); sock.setEncoding('utf8'); sock.write('Hello Echo Server\r\n'); }); sock.on('data', function(data){ console.log('got data from server - ', data); }); sock.on('end', function(){ console.log('client disconnected'); }); sock.on('error', function(err){ console.log('socket error - ', err); }); sock.on('close', function(){ console.log('echo client was closed'); process.exit(0); }); var rl = readline.createInterface({ input: process.stdin }); function quitEcho(){ rl.close(); sock.end(); console.log('quit echo client'); } rl.on('line', function(cmd){ if(cmd.indexOf('quit') == 0 || cmd.indexOf('exit') == 0){ quitEcho(); }else{ sock.write(cmd + '\r\n'); } }); rl.on('SIGINT', quitEcho);
調(diào)用readline模塊來從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)來發(fā)送給客戶端。readline的文檔在這里:https://nodejs.org/api/readline.html。正如它的名字,Readline可以讓你一行一行的讀取一個流。比較常見的就是讀取標(biāo)準(zhǔn)輸入流。Readline有一些事件,我們用到的“l(fā)ine”事件,在一行數(shù)據(jù)就緒時(shí)會發(fā)射,帶一個代表數(shù)據(jù)的參數(shù)。監(jiān)聽line事件,在回調(diào)中調(diào)用net.Socket的write方法寫入數(shù)據(jù)。當(dāng)你在控制臺輸入“quit”或“exit”時(shí),調(diào)用quitEcho退出。
net.connect方法可以連接到指定的服務(wù)器,它的原型如下:
net.connect(options[, connectionListener])
第一個參數(shù)是Object,用于指定和連接相關(guān)的選項(xiàng),比如服務(wù)端的host、port等,如果不指定host,就默認(rèn)用localhost作為服務(wù)端主機(jī)名.
net.connect返回net.Socket對象,一旦拿到了Socket實(shí)例,就可以用net.Socket來為所欲為了。監(jiān)聽了data事件來接收服務(wù)端發(fā)揮的數(shù)據(jù),監(jiān)聽close事件來退出進(jìn)程。net.Socket的具體API,參考https://nodejs.org/api/net.html#net_class_net_socket。
希望本文所述對大家node.js程序設(shè)計(jì)有所幫助。
相關(guān)文章
Linux 安裝nodejs環(huán)境及路徑配置詳細(xì)步驟
大家都知道linux安裝nodejs有兩種比較常用的方法,一種解壓即可用的方法操作比較簡便,另一種方法通過編譯來安裝,本文重點(diǎn)給大家講解第一種方法,感興趣的朋友跟隨小編一起看看吧2021-11-11NodeJS連接MongoDB數(shù)據(jù)庫時(shí)報(bào)錯的快速解決方法
下面小編就為大家?guī)硪黄狽odeJS連接MongoDB數(shù)據(jù)庫時(shí)報(bào)錯的快速解決方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考2016-05-05nodejs使用Sequelize框架操作數(shù)據(jù)庫的實(shí)現(xiàn)
這篇文章主要介紹了nodejs使用Sequelize框架操作數(shù)據(jù)庫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10node.js利用express自動搭建項(xiàng)目的全過程
這篇文章主要給大家介紹了關(guān)于node.js利用express自動搭建項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Node.js的Koa實(shí)現(xiàn)JWT用戶認(rèn)證方法
本篇文章主要介紹了Node.js的Koa實(shí)現(xiàn)JWT用戶認(rèn)證方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05