Node.js踩坑之旅(三)--dgram中Socket对象的close和unref

news/2024/5/18 12:07:50 标签: Node.js, dgram, UDP, Socket

文章目录


在踩坑之旅(二)中,我提到了 net模块中 Server对象的 close事件和同名方法以及 Socket对象的 end事件和同名方法。还有就是两者都有的 unref方法。

而在Node.jsdgram模块中定义的Socket对象则具有close事件和同名方法以及unref方法。

不过与我写踩坑之旅(二)的原因一样,dgram模块中定义的Socket对象的close事件和同名方法以及unref方法,在作用上非常相似。

dgramSocketclose_7">dgram.Socket的close方法和事件

close事件

当调用Socket对象的close方法之后close事件就会被触发。例如:

let dgram = require('dgram');

let socket = dgram.createSocket("udp4");

socket.on('close', ()=>{
	console.log('Socket对象已关闭');
});

socket.close();

运行结果:

在这里插入图片描述

Socket对象被关闭之后再调用它的其他方法都会报Not Running的错误。

let dgram = require('dgram');
let udpServer = dgram.createSocket("udp4");

udpServer.on('message', (msg, rinfo)=>{
    udpServer.close();
    console.log(`客户端IP地址为${rinfo.address}`);
    console.log('接收到的信息为:' + msg);
    let sendMsg = new Buffer(msg);
    udpServer.send(sendMsg, rinfo.port, rinfo.address, (err, bytes)=>{
        if(err){
            console.warn(err);
        } else {
            console.log(`发送${bytes}个字节的数据`);
        }
    });
});

udpServer.bind(2000);

udpServer.on('listening', ()=>{
    let address = udpServer.address();
    console.log('服务器开始监听,地址为:' + address);
});

例如上面的代码,执行后结果如下图:
在这里插入图片描述

dgramSocketunref_59">dgram.Socket的unref方法

By default, binding a socket will cause it to block the Node.js process from exiting as long as the socket is open. The socket.unref() method can be used to exclude the socket from the reference counting that keeps the Node.js process active, allowing the process to exit even if the socket is still listening.

以上摘自Node.js的官方文档关于unref方法的介绍。这段话是说Socket对象会阻止Node.js的进程退出,然而使用unref方法可以让Socket对象不进行引用计数。

换句话说,就是当执行了Sokcet对象的unref方法之后,当Socket对象不再进行通信时,程序会退出。

值得注意的是这句话“ allowing the process to exit even if the socket is still listening”。就是说即使是Socket对象还在监听数据,也允许退出。


http://www.niftyadmin.cn/n/1700945.html

相关文章

浏览器事件机制与自定义事件的实现

一、 0 级 DOM 上的事件和 2 级 DOM 事件机制 0 级 DOM 上的事件又称原始事件模型,所有的浏览器都支持他,而且是通用的。 2 级 DOM 事件机制又为标准事件模型,除了 ie 其他浏览器都支持( ie9 据说也支持,有待考证&…

Node.js踩坑之旅(四)— 跨域请求的问题(CORS)

通过最近的学习发现,那些技术书籍未必都那么严谨,有些或多或少都有些问题。特别是书上的示例代码,最好都理解后自己再写一遍。说不定就能碰到书上没有说到的问题。 我今天看到了http模块。书上有一个关于Ajax请求数据的例子,我看…

安卓Bitmap实现手势缩放、旋转、拖动

1、创建一个类MyImageView import android.content.Context; import android.graphics.Matrix; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.Scale…

layuiadmin上手好难_干了三年SEO优化还是个员工,升职为什么这么难?先看自己有没有这些能力...

最近几年,从事SEO优化工作的人越来越多,但能做出成绩的真不多,我有好几个同事干了三年优化工作,要么还是个员工,要么离职转行了,难道升职就这么难吗?其实,做任何工作想要升职都可以说…

ES6的扩展操作符

ES6中的扩展操作符实际上与rest参数非常相似。前者是...,后者则是...变量名。 那它们主要的区别我个人认为主要是两个: rest参数使用在函数的参数定义时,扩展操作符使用在函数调用时。 function foo(...items){ //这里的...items就是rest参…

Macports 解决某些包同时依赖不同版本库的办法

2019独角兽企业重金招聘Python工程师标准>>> 问题很奇葩: 最初是想在 CLISP 上用 portableaserve,于是用 quicklisp 安装 (ql:quickload :aserve)结果出现各种问题,包括修改代码什么的,具体内容如下&#x…

词法分析阶段的错误处理

文章目录词法分析阶段可检测错误的类型:词法错误检测:错误处理词法分析阶段可检测错误的类型: 单词拼写错误: 例:int i 0x3G(16进制数表示错误)、float j 1.05e(指数表示错误) 非法字符:例如~、等 词法…

socket传照片java服务器python客户端

Java服务器 package Socket;import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;public class SS {public static void main(String[] args) throws Exception{ServerSocket ss new …