Node.js開(kāi)發(fā)之套接字(socket)編程入門(mén)示例
本文實(shí)例講述了Node.js套接字(socket)編程。分享給大家供大家參考,具體如下:
Node.js的net模塊提供了socket編程接口,方便我們利用較為底層的套接字接口來(lái)實(shí)現(xiàn)應(yīng)用協(xié)議。這次我們看一個(gè)簡(jiǎn)單的回顯服務(wù)器示例,包括服務(wù)端和客戶(hù)端的代碼。
代碼
分服務(wù)器和客戶(hù)端兩部分來(lái)說(shuō)吧。
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來(lái)創(chuàng)建一個(gè)服務(wù)器實(shí)例,這個(gè)方法的返回值是一個(gè)net.Server實(shí)例,net.Server提供了listen方法,讓我們監(jiān)聽(tīng)到某個(gè)端口上來(lái)接受客戶(hù)端連接,同時(shí)還提供了一些屬性,比如maxConnections可以設(shè)置服務(wù)器的并發(fā)連接數(shù)上限(當(dāng)服務(wù)器的連接數(shù)超過(guò)這個(gè)值時(shí),后續(xù)連接就會(huì)被拒掉),還有其它的,看文檔吧:https://nodejs.org/api/net.html#net_class_net_server。
net.Server還提供了一些事件,比如error、connection等。當(dāng)有客戶(hù)端連接被接受時(shí),會(huì)發(fā)射connection事件,這個(gè)事件帶一個(gè)net.Socket對(duì)象作為參數(shù),可以在回調(diào)函數(shù)里訪問(wèn)這個(gè)net.Socket實(shí)例來(lái)與客戶(hù)端交互。我在代碼里,給createServer方法傳入了一個(gè)callback來(lái)處理connection事件,實(shí)際上也可以略作修改,通過(guò)監(jiān)聽(tīng)connection事件的方法處理客戶(hù)端連接。新代碼如下:
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對(duì)象有一些方法,比如write可以寫(xiě)數(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模塊來(lái)從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)來(lái)發(fā)送給客戶(hù)端。readline的文檔在這里:https://nodejs.org/api/readline.html。正如它的名字,Readline可以讓你一行一行的讀取一個(gè)流。比較常見(jiàn)的就是讀取標(biāo)準(zhǔn)輸入流。Readline有一些事件,我們用到的“l(fā)ine”事件,在一行數(shù)據(jù)就緒時(shí)會(huì)發(fā)射,帶一個(gè)代表數(shù)據(jù)的參數(shù)。監(jiān)聽(tīng)line事件,在回調(diào)中調(diào)用net.Socket的write方法寫(xiě)入數(shù)據(jù)。當(dāng)你在控制臺(tái)輸入“quit”或“exit”時(shí),調(diào)用quitEcho退出。
net.connect方法可以連接到指定的服務(wù)器,它的原型如下:
net.connect(options[, connectionListener])
第一個(gè)參數(shù)是Object,用于指定和連接相關(guān)的選項(xiàng),比如服務(wù)端的host、port等,如果不指定host,就默認(rèn)用localhost作為服務(wù)端主機(jī)名.
net.connect返回net.Socket對(duì)象,一旦拿到了Socket實(shí)例,就可以用net.Socket來(lái)為所欲為了。監(jiān)聽(tīng)了data事件來(lái)接收服務(wù)端發(fā)揮的數(shù)據(jù),監(jiān)聽(tīng)close事件來(lái)退出進(jìn)程。net.Socket的具體API,參考https://nodejs.org/api/net.html#net_class_net_socket。
希望本文所述對(duì)大家node.js程序設(shè)計(jì)有所幫助。
- nodejs開(kāi)發(fā)一個(gè)最簡(jiǎn)單的web服務(wù)器實(shí)例講解
- 如何利用node.js開(kāi)發(fā)一個(gè)生成逐幀動(dòng)畫(huà)的小工具
- Node.js實(shí)現(xiàn)用戶(hù)評(píng)論社區(qū)功能(體驗(yàn)前后端開(kāi)發(fā)的樂(lè)趣)
- 手把手教你使用TypeScript開(kāi)發(fā)Node.js應(yīng)用
- node.js實(shí)現(xiàn)微信開(kāi)發(fā)之獲取用戶(hù)授權(quán)
- nodejs微信開(kāi)發(fā)之授權(quán)登錄+獲取用戶(hù)信息
- NodeJS開(kāi)發(fā)人員常見(jiàn)五個(gè)錯(cuò)誤理解
相關(guān)文章
Node.js實(shí)現(xiàn)登錄注冊(cè)功能
這篇文章主要為大家詳細(xì)介紹了Node.js實(shí)現(xiàn)登錄注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
nodejs中簡(jiǎn)單實(shí)現(xiàn)Javascript Promise機(jī)制的實(shí)例
這篇文章主要介紹了nodejs中簡(jiǎn)單實(shí)現(xiàn)Javascript Promise機(jī)制的實(shí)例,本文在nodejs中簡(jiǎn)單實(shí)現(xiàn)一個(gè)promise/A 規(guī)范,需要的朋友可以參考下2014-12-12
Node.js和Express中設(shè)置TypeScript的實(shí)現(xiàn)步驟
本文主要介紹了Node.js和Express中設(shè)置TypeScript的實(shí)現(xiàn)步驟文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
Nodejs環(huán)境實(shí)現(xiàn)socket通信過(guò)程解析
這篇文章主要介紹了Nodejs環(huán)境實(shí)現(xiàn)socket通信過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Node.js入門(mén)教程:在windows和Linux上安裝配置Node.js圖文教程
這篇文章主要介紹了Node.js入門(mén)教程:在windows和Linux上安裝配置Node.js的方法,本文圖文并茂,步驟明細(xì),是學(xué)習(xí)安裝node.js的絕佳教程,需要的朋友可以參考下2014-08-08
Node.js?中的服務(wù)器相關(guān)概念(常見(jiàn)的服務(wù)器任務(wù))
Node.js?中,服務(wù)器的創(chuàng)建與管理是非常重要的內(nèi)容,Node.js?的非阻塞?I/O?特性使得它特別適合處理高并發(fā)的請(qǐng)求,本文將介紹一些與?Node.js?服務(wù)器相關(guān)的基本概念,包括?HTTP?服務(wù)器、請(qǐng)求和響應(yīng)、路由、以及如何處理常見(jiàn)的服務(wù)器任務(wù),感興趣的朋友一起看看吧2025-04-04
nodejs報(bào)digital?envelope?routines::unsupported錯(cuò)誤的最新解決方法
這篇文章主要介紹了nodejs報(bào)digital?envelope?routines::unsupported錯(cuò)誤的最新解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02

