溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在Node.js中實(shí)現(xiàn)套接字

發(fā)布時(shí)間:2021-06-04 16:50:43 來(lái)源:億速云 閱讀:142 作者:Leah 欄目:web開發(fā)

本篇文章給大家分享的是有關(guān)怎么在Node.js中實(shí)現(xiàn)套接字,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

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)聽到某個(gè)端口上來(lái)接受客戶端連接,同時(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)有客戶端連接被接受時(shí),會(huì)發(fā)射connection事件,這個(gè)事件帶一個(gè)net.Socket對(duì)象作為參數(shù),可以在回調(diào)函數(shù)里訪問(wèn)這個(gè)net.Socket實(shí)例來(lái)與客戶端交互。我在代碼里,給createServer方法傳入了一個(gè)callback來(lái)處理connection事件,實(shí)際上也可以略作修改,通過(guò)監(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對(duì)象有一些方法,比如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模塊來(lái)從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)來(lái)發(fā)送給客戶端。readline的文檔在這里:https://nodejs.org/api/readline.html。正如它的名字,Readline可以讓你一行一行的讀取一個(gè)流。比較常見的就是讀取標(biāo)準(zhǔn)輸入流。Readline有一些事件,我們用到的“l(fā)ine”事件,在一行數(shù)據(jù)就緒時(shí)會(huì)發(fā)射,帶一個(gè)代表數(shù)據(jù)的參數(shù)。監(jiān)聽line事件,在回調(diào)中調(diào)用net.Socket的write方法寫入數(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)聽了data事件來(lái)接收服務(wù)端發(fā)揮的數(shù)據(jù),監(jiān)聽close事件來(lái)退出進(jìn)程。net.Socket的具體API,參考https://nodejs.org/api/net.html#net_class_net_socket。

以上就是怎么在Node.js中實(shí)現(xiàn)套接字,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI