乐趣区

NodeJs简明教程10

NodeJs 简明教程将从零开始学习 NodeJs 相关知识,助力 JS 开发者构建全栈开发技术栈!

关注获取更多NodeJs 精品文章

本文是 NodeJs 简明教程的第十篇,将介绍 NodeJs dgram 模块 (UDP 服务端 / 客户端) 相关的基本操作。

啥是 UDP

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。RFC 768 描述了 UDP。

NodeJs 使用 dgram 模块 实现 UDP 服务端 / 客户端 相关功能。

dgram.createSocket用来创建一个 Socket 对象,可以基于该套接口 接收 发送 数据。该方法原型如下:

dgram.createSocket(type[, callback])

  • type <string> socket 类型。udp4udp6,对应ipv4ipv6
  • callback <Function> 接收到消息时的回调函数

Echo 服务端开发

server.js

const dgram = require('dgram');
const socket = dgram.createSocket('udp4');

socket.on('error', function(err) { // 监听 socket 错误
    console.log('服务器错误', err);
    socket.close();});

socket.on('message',function(msg,sender) { // 监听收到数据
    console.log('%s:%d => %s', sender.address,sender.port,msg.toString()); // 打印该数据包详情
    socket.send('socket:'+msg.toString(),sender.port,sender.address,function(err) { // 发送数据给来源地址
        if(err) {console.log('回复 %s:%d 失败: %s',sender.address,sender.port,err.message);
            return;
        }
   });
});

socket.bind(10000, function() { // 监听 UDP 端口
    console.log('服务器正在监听 %s:%d', socket.address().address, socket.address().port);
});

Echo 客户端开发

由于 telnet 连接服务器使用的是TCP 协议,所以本文对应的客户端需要使用 NodeJs 开发。

client.js

const dgram = require('dgram');

const socket = dgram.createSocket('udp4'); // 创建 socket 实例

socket.on('message', function(msg,sender) { // 监听收到数据
    console.log('接收到 %s:%d 的消息:%s',sender.address,sender.port,msg.toString());
    socket.close();});

socket.send('hello',10000,function(err) { // 向目标端口发送数据
    if(err) {console.log('发送错误', err);
        return;
    }
    console.log('发送成功');
});

执行

  1. 终端执行node server.js,输出

    服务器正在监听 0.0.0.0:10000
  2. 终端执行node client.js,输出

    发送成功
    接收到 127.0.0.1:10000 的消息:server: hello
  3. 服务端输出:

    127.0.0.1:50577 => hello

结语

NodeJs UDP 服务端与客户端开发到此结束,但是使用 UDP 的情况下,数据包确认、流量控制等等操作都需要程序员手动完成,这一方面确实挺复杂的,没有什么特殊的要求的话使用 TCP 即可。

退出移动版