Node.js用户数据报dgram模块创建的UDP对象中的方法和事件

 2015年08月18日    1062     声明


UDP是一个轻量级的传输协议,在降低连接可靠性限制后,它比TCP负载要小的多并且可以广播和多播。在Node.js中,如果想要发送或接收UDP消息,首先要使用dgram模块创建一个UDP套接字对象,此对象可以用来发送消息给其它UDP服务器。在UDP并没有真正的服务器,只有在套接字监听消息的终端。如果要监听传入消息,就需要将套接字对象绑定到一个UDP端口上,然后监听message消息。

  1. dgram.Socket类中的事件
  2. dgram.Socket类中的方法

通过dgram模块中的createSocket(),可以创建一个UDP Socket套接字对象,这个对象即可以做为客户端向其它UDP服务器发送数据,也以作为服务端监听传入UDP消息。


1. dgram.Socket类中的事件

1.1 Event: 'message'

UDP Socket套接字收到新的数据报文(datagram),会触发这个事件。这个事件的监听函数有两个参数:msgrinfomsg是一个Bufferrinfo是一个包含了发送者地址信息的对象。

socket.on('message', function(msg, rinfo) {
    console.log('收到 %d 字节数据,来自 %s:%d\n',
        msg.length, rinfo.address, rinfo.port);
});


1.2 Event: 'listening'

当一个UDP Socket套接字开始监听数据报时触发此事件,一般发生在UDP Socket套接字被创建时。


1.3 Event: 'close'

当一个套接字调用close()关闭时触发,触发后这个套接字上不会再有message事件发生。


1.4 Event: 'error'

当发生错误时会触发这个事件,触发后会返回一个exception Error对象。


2. dgram.Socket类中的方法

2.1 发送数据:socket.send(buf, offset, length, port, address[, callback])

  • buf:要发送的消息,Buffer对象或字符串。
  • offset:消息在缓存中得偏移量。
  • length:消息的长度(位长)。
  • port:消息接收方的端口。
  • address:消息接收方的主机名或IP地址,如果忽略地址或者地址是空字符串,将使用 '0.0.0.0''::0' 替代。
  • callback:消息发送完毕后的回调函数,可选。
var dgram = require('dgram');
//要发送的数据
var message = new Buffer("itbilu.com");
//创建UDP套接字对象
var client = dgram.createSocket("udp4");

//发送数据
client.send(message, 0, message.length, 3333, "localhost", function(err) {
    client.close();
});


2.2 绑定UDP对象:socket.bind()

socket.bind()方法有下面两种形式

  • socket.bind(port[, address][, callback]):将UDP Socket套接字绑定到一个端口和可选地址上,并监听用户数据报文(datagram)。如果没有指定端口和地址,系统会监听所有的地址。绑定方法调用后,会触发listening事件,并调用传入的回调函数。
  • socket.bind(options[, callback]):通过options对象绑定UDP Socket套接字,options对象有以下选项:
    • port {Number} - 绑定的端口,必选。
    • address {字符串} - 绑定的地址,可选。
    • exclusive {Boolean} - 可选,如果 exclusive默认是 false,当为false时集群进程将会使用相同的底层句柄,允许连接处理共享的任务。当exclusivetrue 时,句柄不会共享,尝试共享端口也会失败。


var dgram = require("dgram");

var server = dgram.createSocket("udp4");

server.on("error", function (err) {
    console.log("服务器错误:\n" + err.stack);
    server.close();
});

server.on("message", function (msg, rinfo) {
    console.log("服务器收到消息: " + msg + " 来自 " +
        rinfo.address + ":" + rinfo.port);
});

server.on("listening", function () {
    var address = server.address();
    console.log("服务器监听 " +
      address.address + ":" + address.port);
});

//服务器监听0.0.0.0:3333
server.bind(3333);


2.3 关闭UDP:socket.close()

socket.close()方法会关闭底层UDP Socket套接字并且停止监听数据,调用此方法会触发close事件。


2.4 查看UDP套接字地址信息的对象:socket.address()

返回一个包含了套接字地址信息的对象。对于UDP套接字对象,该对象会包含地址 address、地址族 family 和端口号port


2.5 dgram.Socket类中一些设置

dgram.Socket类中有几个设置UDP Socket套接字对象的方法。

  • socket.setBroadcast(flag)flag - Boolean。设置或清除 SO_BROADCAST 套接字选项。当该选项被设置,则UDP报文可能被发送到一个本地接口的广播地址。
  • socket.setTTL(ttl)ttl - 整数。设置 IP_TTL 套接字选项。TTL 表示“Time to Live”(生存时间),但在此上下文中它指报文允许通过的 IP 跃点数。ttl参数为1到255的跃点数,多数系统默认值为64。
  • socket.setMulticastTTL(ttl)ttl - 整数。设置 IP_MULTICAST_TTL 套接字选项。TTL 表示“Time to Live”(生存时间),但在此上下文中它指的是报文允许通过的 IP 跃点数,特别是组播流量。ttl参数为1到255的跃点数,多数系统默认值为1。
  • socket.setMulticastLoopback(flag)::flag - Boolean。设置或清除 IP_MULTICAST_LOOP 套接字选项。当该选项被设置时,组播报文也会被本地接口收到。


2.6 添加与移除组播成员

  • socket.addMembership(multicastAddress[, multicastInterface]):告诉UDP将指定成员加入广播组,选项为 IP_ADD_MEMBERSHIP,如果未指定multicastInterface,则操作系统会尝试向所有有效接口添加成员。


  • socket.dropMembership(multicastAddress[, multicastInterface]):与 addMembership 相反,以IP_DROP_MEMBERSHIP 套接字为选项告诉UDP将指定成员移除广播组。当套接字被关闭或进程结束时内核会自动调用,因此大多数应用都没必要调用。如果未指定 multicastInterface,则操作系统会尝试向所有有效接口移除成员。


2.7 退出与清除退出:socket.unref()socket.ref()

如果当前UDP Socket套接字是唯一一个活动的套接字,调用unref将允许程序退出。如果套接字已被 unref,则再次调用unref则不会产生影响。

unref 相反,如果这是仅剩的套接字,在一个之前被 unref 了的套接字上调用 ref不会让程序退出(缺省行为)。如果一个套接字已经被 ref,则再次调用ref则不会产生影响。