📜  Node 中的服务器、流和套接字

📅  最后修改于: 2022-05-13 01:56:52.964000             🧑  作者: Mango

Node 中的服务器、流和套接字

Node.js 服务器

Node.js 是一个用于编写服务器端应用程序的 JavaScript 框架。
Node.js 服务器提供了连接到服务和发送/接收数据的机制。它通过 TCP 或 UDP 连接实现这一点。因此,开发人员可以创建自己的服务器并测试他们的应用程序部署。
NodeJS 内置了一个简单的 HTTP 服务器。这个 HTTP 服务器允许我们监听任意端口(由我们指定)并通过回调函数接收回调,该回调函数将在每次向服务器发出请求时调用。
回调将接收两个参数:一个请求对象和一个响应对象。 Request 对象将填充有关请求的有用属性,而 Response 对象将用于向客户端发送响应。

安装 Node 后,让我们尝试构建我们的第一个 Web 服务器。例如,让我们编写一个 server.js 文件——

const http = require('http');
  
const hostname = '127.0.0.1';
const port = 8081;
  
const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello, Welcome to GeeksforGeeks !\n');
});
  
server.listen(port, hostname, () => {
  console.log(`Your Node.js server is running at http://${hostname}:${port}/`);
});

现在从终端执行这个文件只需写: -

node server.js

你会看到:

在导航到指定的 url 时,将打开一个简单的 HTML 页面,显示:

因此,我们创建了一个监听 8081 端口的本地 Node.js Web 服务器。

Node.js 流

流是数据的集合——就像数组或字符串一样。流是在 Node.js 中处理流数据的抽象接口。流模块提供了一个基础 API,可以轻松构建实现流接口的对象。在 Node.js 中,有四种类型的流——

    Writable – 可以写入数据的流。
    可读- 可以从中读取数据的流。
    Duplex – 既可读又可写的流。
    转换– 可以在写入和读取数据时修改或转换数据的双工流

使用 Node.js 流,我们可以修改和转换数据。

使用 Streams 读取文件

创建具有任意内容的文本文件。例如——具有以下内容的 Node.txt——

Welcome to Nodejs streams usage. Read this file.

创建一个js文件,example-read.js,内容如下-

var fs = require("fs"); //using the Node fs module you can read a file
var data = '';
  
// Create a read stream with your text file name in quotes (Node.txt)
var readerStream = fs.createReadStream('Node.txt'); 
  
readerStream.setEncoding('UTF8');
  
//Stream events-
//'data','end','error'----see details at 
https://nodejs.org/api/stream.html#stream_class_stream_readable
  
readerStream.on('data', function(chunk) {
   data += chunk;
});
  
readerStream.on('end',function() {
   console.log(data);
});
  
readerStream.on('error', function(err) {
   console.log(err.stack);
});
  
console.log("Reading complete");

现在运行上面的 read.js 文件来查看输出——

使用流写入文件

创建一个js文件,example-write.js,内容如下-

var fs = require("fs");
  
//data variable containing the data to be written to the file
var data = 'Hello welcome to Node.js tutorials on GeeksforGeeks'; 
  
// Create a writable stream with the output file name in quotes (Node1.txt)
var writerStream = fs.createWriteStream('Node1.txt');
  
// utf8 encoding
writerStream.write(data,'UTF8');
  
//end of file
writerStream.end();
  
// Handle stream events --> finish, and error
writerStream.on('finish', function() {
   console.log("Write completed.");
});
  
writerStream.on('error', function(err) {
   console.log(err.stack);
});
  
console.log("You've successfully created Node1.txt");

执行上面的文件——

并且已经创建了文本文件。去检查-

Node.js 套接字

这里我们指的是 Node.js 的“net”模块,而不是指 Socket.IO——一个支持浏览器和服务器之间实时、双向和基于事件的通信的库。

net 模块提供了一个异步网络 API,用于创建基于流的 TCP 或 IPC 服务器 (net.createServer()) 和客户端 (net.createConnection())。

“net.Socket”是一个抽象的 TCP 套接字或流式 IPC 端点的类,也是一个双工流,因此它可以用于读取和写入数据。

net.Socket 可以由用户创建并直接用于与服务器交互。例如,它由 net.createConnection() 返回,因此用户可以使用它与服务器对话。

它也可以由 Node.js 创建并在收到连接时传递给用户。例如,它被传递给 net.Server 上发出的“连接”事件的侦听器,因此用户可以使用它与客户端交互。

例如,要在 Node.js 中创建一个测试套接字,请创建一个文件 example-test.js,其内容如下 -

// server
require('net').createServer(function (socket) {
    console.log("connected");
  
    socket.on('data', function (data) {
        console.log(data.toString());
    });
})
  
.listen(8082);
  
// client
var s = require('net').Socket();
s.connect(8082);
s.write('Hello');
s.end();

运行上述文件会创建一个客户端-服务器模型并返回 -

net.Socket 带有许多功能和事件,例如-

事件:'关闭'-
添加于:v0.1.90
hadError 如果套接字有传输错误,则为 true。
一旦套接字完全关闭就发出。参数 hadError 是一个布尔值,表示套接字是否由于传输错误而关闭。

事件:'连接'-
添加于:v0.1.90
成功建立套接字连接时发出。请参阅 net.createConnection()。

socket.address()[src]-
添加于:v0.1.90
回报:
返回操作系统报告的绑定地址、地址族名称和套接字端口:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }

socket.bytesRead-
添加于:v0.5.3
接收的字节数。

socket.bytesWritten-
添加于:v0.5.3
发送的字节数。

进一步可以在参考资料中提到的 Node.js 的官方文档中进行探索。

参考

1.)https://nodejs.org/api/
2.) https://nodejs.org/en/docs/