码迷,mamicode.com
首页 > Web开发 > 详细

Node.js开发入门—UDP编程

时间:2015-09-19 08:30:53      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:node.js   udp   socket   angularjs   mongodb   

Node.js也提供了UDP编程的能力,相关类库在“dgram”模块里。

与TCP不同,UDP是无连接的,不保障数据的可靠性,不过它的编程更为简单,有时候我们也需要它。比如做APP的统计或者日志或者流媒体,很多流媒体协议都会用到UDP,网上一搜一大堆。

使用UDP,如果你要发送数据,只需要知道对方的主机名(地址)和端口号,扔一消息过去即可。至于对方收不收得到,听天由命了。这就是数据报服务,类似快递或邮件。

我们这次来介绍一下Node.js里的UDP编程,我会提供一个UDP版本的echoServer和echoClient。

UDP编程的一般模型

客户端和服务端分开来说。

先说服务端吧。

服务端

作为UDP服务器,要想接收来自客户端的消息,在Node.js里,大体有这么几步:

  1. 导入dgram模块
  2. 创建socket(套接字)
  3. 处理message事件
  4. 绑定端口

后面我们的echoServer示例可以看到具体的代码。

客户端

客户端UDP编程就更简单了,一下几步,就可以了:

  1. 导入dgram模块
  2. 创建socket(套接字)
  3. 发送消息

当然有时你也可能希望客户端也能收到服务消息,比如你发一个消息给服务端,希望服务端反馈,那此时就也需要处理message事件和绑定端口。具体就看我们的echoClient示例了。

API介绍

要使用dgram模块,只需这样:

var dgram = require(‘dgram‘);

引入了dgram后,就可以使用它提供的方法createSocket来创建套接字了。createSocket方法返回一个dgram.Socket对象,这个对象提供了一系列的方法和事件。

dgram.Socket的bind方法把socket和一个端口绑定到一起,比如echo服务的端口是7,那下面的代码片段就创建了一个socket并绑定到端口7上:

var dgram = require(‘dgram‘);
var serverSocket = dgram.createSocket(‘udp4‘);
serverSocket.bind(7);

在有消息到达时dgram.Socket会发射message事件,我们监听这个事件就可以处理消息:

serverSocket.on(‘message‘, function(msg, rinfo){
  ...
});

message事件对应的回调函数有两个参数,一个是Buffer对象msg,代表客户端发送过来的数据。一个是rinfo,携带了远程主机的信息,rinfo.address是远程主机的地址,rinfo.port是远程主机的端口。

dgram.Socket还有“error”、“close”、“listening”等事件,参考在线文档:https://nodejs.org/api/dgram.html

要发送数据,可以调用dgram.send方法,就像下面这样:

var msg = new Buffer(‘Hello Server‘);
serverSocket.send(msg, 0, msg.length, 7, "127.0.0.1");

示例

echoServerUdp.js实现了我们的echoServer示例,代码如下:

var dgram = require(‘dgram‘);

var serverSocket = dgram.createSocket(‘udp4‘);

serverSocket.on(‘message‘, function(msg, rinfo){
  console.log(‘recv %s(%d bytes) from client %s:%d\n‘, msg, msg.length, rinfo.address, rinfo.port);

  //echo to client
  serverSocket.send(msg, 0, msg.length, rinfo.port, rinfo.address);
});

//    err - Error object, https://nodejs.org/api/errors.html
serverSocket.on(‘error‘, function(err){
  console.log(‘error, msg - %s, stack - %s\n‘, err.message, err.stack);
});

serverSocket.on(‘listening‘, function(){
  console.log("echo server is listening on port 7.");
})

serverSocket.bind(7);

echoClientUdp.js实现了echo客户端,代码如下:

var dgram = require(‘dgram‘);

var clientSocket = dgram.createSocket(‘udp4‘);

var messages = [
  ‘Hello, Echo Server.‘,
  ‘Are you OK?‘,
  ‘I am happy.‘,
  ‘A little panda found a pumpkin.‘
];

var index = 0;

function sendMsg(){//send to server
  var msg = messages[index];
  index = index + 1;
  if(index == messages.length){
    index = 0;
  }
  clientSocket.send(msg, 0, msg.length, 7, "localhost");
}

//start a timer to send message to echoServer
setInterval(sendMsg, 1000);

clientSocket.on(‘message‘, function(msg, rinfo){
  console.log(‘recv %s(%d) from server\n‘, msg, msg.length);
});

clientSocket.on(‘error‘, function(err){
  console.log(‘error, msg - %s, stack - %s\n‘, err.message, err.stack);
});

clientSocket.bind(54321);

看起来客户端比服务端还要复杂一些,这是因为作为echo客户端,我需要显示服务端发送的消息,所以,也需要监听到一个端口(在示例中是54321)。另外,我还要不断发送数据给服务端,所以用setInterval启动了一个周期性定时器,循环发送一个字符串数组内的消息。

setInterval是Node.js的global对象提供的方法,用来启动一个周期性定时器,原型如下:

setInterval(cb, ms)

第一个参数是定时器触发时会执行的回调函数,第二个参数是定时器的周期,单位是毫秒。我们的示例中,每隔1000毫秒发送一条消息给服务器。

setInterval返回一个代表定时器的值,你可以把它传递给clearInterval来取消对应的定时器。

另外echoServer和echoClient在处理dgram.Socket的error事件时,用到了Error对象,文档在这里:https://nodejs.org/api/errors.html

好啦,代码就这样,可以打开两个命令行窗口,分别执行“node echoServerUdp.js”和“node echoClientUdp.js”来观察效果。


其它文章:

版权声明:本文为foruok原创文章,未经博主允许不得转载。

Node.js开发入门—UDP编程

标签:node.js   udp   socket   angularjs   mongodb   

原文地址:http://blog.csdn.net/foruok/article/details/48572053

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!