- UDP不是面向连接的,一个套接字可以与多个UDP服务通信
- 虽然提供面向事务的简单不可靠信息传输服务,在网络差的情况下存在丢包严重的问题,但是由于它无须连接,资源消耗低,处理快速且灵活,所以常常应用在那种偶尔丢一两个数据包也不会产生重大影响的场景,比如音频、视频等
- DNS服务就是基于它实现的
创建UDP套接字
- UDP套接字一旦创建,既可以作为客户端发送数据,也可以作为服务器端接受数据
var dgram = require('dgram'); var socket = dgram.createSocket('udp4');
创建UDP服务器端
- 若想让UDP套接字接收网络消息,只要调用
dgram.bind(port, [address])
方法对网卡和端口进行绑定即可var dgram = require('dgram'); var server = dgram.createSocket('udp4'); // 当访问这台服务器时,会执行下面的 server.on('message', function(msg, rinfo) { console.log('server got: ' + msg + 'from' + rinfo.address + ':' + rinfo.port); }); // UDP套接字是EventEmitter的示例 // 给server添加监听器 server.on('listening', function() { var address = server.address(); console.log('server listening' + address.address + ':' + address.port); }); server.bind(41234);
创建UDP客户端
- 创建一个客户端与服务器端进行对话
var dgram = require('dgram'); var message = new Buffer('深入浅出Node.js'); var client = dgram.createSocket('udp4'); // message 是发送给服务器的消息 client.send(message, 0, message.length, 41234, 'localhost', function(err, bytes) { client.close(); })
- 服务器端的命令行将会有如下输出
send()
方法的参数如下
- 与
TCP
套接字的write()
相比,send()
方法的参数列表相对复杂,但是它更灵活的地方在于可以随意发送数据到网络中的服务器端,而TCP
如果要发送数据给另一个服务器端,则需要重新通过套接字构造新的连接
UDP套接字事件
UDP套接字是一个EventEmitter实例,具有如下自定义事件
- ❑ message:当UDP套接字侦听网卡端口后,接收到消息时触发该事件,触发携带的数据为消息Buffer对象和一个远程地址信息。
- ❑ listening:当UDP套接字开始侦听时触发该事件。
- ❑ close:调用close()方法时触发该事件,并不再触发message事件。如需再次触发message事件,重新绑定即可。
- ❑ error:当异常发生时触发该事件,如果不侦听,异常将直接抛出,使进程退出