写点什么

Node.js 在 Buffers 对象在数据报的表现交互在 Modules 的实战心得

作者:黎燃
  • 2022-11-24
    内蒙古
  • 本文字数:2373 字

    阅读完需:约 8 分钟

Buffers 缓存对象


纯 Javascript 对 Unicode 非常友好,但它不太擅长处理二进制数据。处理 TCP 数据流或文件时,必须对二进制数据流进行操作。节点提供了创建、操作和接收二进制数据流的方法。


'ascii' - 应用于7位的ASCII 数据。这种编码方式速度很快,它会删除字节的高位。'utf8' - Unicode 字符。许多网页和其他文档使用UTF-8。'binary' - 一种只使用每个字符前8个字节将原始的二进制数据编码进字符串的方式。这个方式已经废弃,应当尽量使用buffer 对象。这个编码将会在未来的node 中删除。
复制代码


原始数据保存在 Buffer 类的实例中。缓冲区类似于整数数组,只是它对应于 V8 内存堆外部分配的内存数据段。无法调整缓冲区对象的大小。您可以通过“require('buffer').buffer”使用这个类。缓冲区对象是全局对象。需要为 Buffer 和 Javascirpt 中的字符串对象之间的转换指定编码方法。节点支持以下编码方式:


str = "node.js",buf = new Buffer(str.length),i;for (var i = 0; i < str.length ; i += 1) {buf[i] = str.charCodeAt(i);}console.log(buf);
复制代码

dgram 数据报

要使用数据包 SOCKETS,您需要调用 require('gram')。数据报通常用于处理 IP/UDP 信息,但数据报也可以用于 UNIX 域套接字事件:“message”函数(msg,rinfo){}当套接字上有新的数据报可用时发出。msg 是一个缓冲区,rinfo 是一个对象,包含发送方的地址信息和数据报中的字节数。当 SOCKET 接收到新数据包时,会触发此事件。msg 是一个缓冲区变量,rinfo 是一个包含发送方地址信息和数据报字节长度的对象事件:“倾听”


function () { }
复制代码


var dgram = require('dgram'),message = new Buffer("A message to log.");client = dgram.createSocket("unix_dgram");client.send(message, 0, message.length, "/var/run/syslog",function (err, bytes) {if (err) {throw err;}console.log("Wrote " + bytes + " bytes to socket.");});
复制代码


从 MESSAGE 中偏移量为 0 的位置开始,长度为 MESSAGE。通过/var/run/syslog 发送这些 length 内容后,将调用 CALLBACK。如果出现错误,将引发异常。否则,控制台日志实际发送了多少字节。dgram。send(buf,offset,length,port,address,[callback])对于 UDPSOCKETS,必须指定目标端口和 IP 地址。您可以使用字符串指定地址参数,该参数可以通过 DNS 解析。CALLBACK 可以用作检测任何 DNS 错误以及是否重复使用 BUF 的选项。请记住,DNS 搜索至少会将 SEND 操作延迟到下一个执行时间段。确认发送操作已发生的唯一方法是使用 CALLBACK

dgram.bind(path)

它仅在 Unxi DOMAIN DATAGRAM SOCKET 中用于开始侦听来自指定路径上的 SOCKET 的数据报。请记住,客户端可以直接调用 SEND()而不是 BIND(,但如果没有 BIND),则无法接收任何信息。以下是使用 UNIX 域数据包服务器回显接收到的信息的示例:


var dgram = require("dgram");var serverPath = "/tmp/dgram_server_sock";var server = dgram.createSocket("unix_dgram");server.on("message", function (msg, rinfo) {console.log("got: " + msg + " from " + rinfo.address);server.send(msg, 0, msg.length, rinfo.address);});server.on("listening", function () {console.log("server listening " + server.address().address);})server.bind(serverPath);
复制代码


dgram.close()此方法关闭非延迟 SOCKET 并停止侦听其上的数据。即使未调用 BIND()方法 UDP SOCKET,它也会自动侦听消息。dgram.address()返回包含 SOCKET 地址信息的对象。对于 UDP SOCKETS,此对象将包含地址和端口。对于 UNIX DOMAIN SOCKETS,此对象仅包含地址。dgram.setBroadcast(标志)设置或清除 SO_ BROADCAST 选项。设置此选项后,UDP 数据包可以发送到本地接口的广播地址。dgram.setTTL(ttl)设置 IP_ TTL 是“生存时间”选项。然而,在这种情况下,它还可以指定 IP 的 HOPS(转发数据包时每个节点的消耗量。如果 Hop 限制消耗量达到 0,数据包将被取消),以确定数据包允许通过多少节点。每通过一个路由器或网关,TTL 值就会降低。如果路由器将 TTL 减为 0,则数据报将不会继续转发。当 TTL 值用作网络探测器或数据多播时,通常修改 TTL 值以将 HOPS 值从 1 设置为 255。大多数系统将默认为 64

REPL 交互执行

节点的“读取、运行和输出循环模式(REPL)”可以独立执行,也可以轻松嵌入其他程序中。REPL 提供了一种交互执行 Javascript 并查看结果的模式。此模式可用于调试、测试或仅用于一些新功能。如果在没有任何参数的情况下直接执行节点,则将进入 REPL 模式。它类似于简化的电子邮件行编辑模式。


mjr:~$ nodeType '.help' for options.node> a = [ 1, 2, 3];[ 1, 2, 3 ]node> a.forEach(function (v) {... console.log(v);... });123
复制代码


执行 REPL 时,可以输入 Control+D 退出。也可以输入跨多行的表达式。特殊标量“_”(下划线)执行后保存最后一个表达式的值。


node> [ "a", "b", "c" ][ 'a', 'b', 'c' ]node> _.length3node> _ += 14
复制代码

Modules 模块

Node 使用 CommonJS 的模块系统。Node 还有一个简单的模块加载系统。在 Node 的世界中,文件和模块是一对一的。例如,下面的程序 foo Js 将向您展示如何在同一目录 Js 模块中加载圆。foo 的内容。js:foo。Js 代码:


var circle = require('./circle');console.log( 'The area of a circle of radius 4 is '+ circle.area(4));
复制代码

net.Stream TCP 流模块

此对象是 TCP 或 UNIX SOCKET 的抽象。它实现了全双工流接口。网流可以由用户手动创建并用作客户端(和 connect()),也可以由节点创建并通过服务器的“连接”事件传递给用户。(注意:例如,http.Server 的连接事件将把 net.Stream 的实例作为参数传递给响应函数)net Stream 实例将发出以下事件:


function () { }
复制代码


net.createConnection(port, host='127.0.0.1')
复制代码


构造一个新的流对象并打开到指定端口和主机的流。如果未写入第二个参数,则假定主机为 localhost

发布于: 刚刚阅读数: 4
用户头像

黎燃

关注

前端工程师 2022-05-06 加入

专注学习分享前端知识。

评论

发布
暂无评论
Node.js在Buffers对象在数据报的表现交互在Modules的实战心得_前端_黎燃_InfoQ写作社区