c udp tcp消息服务器,TCP/UDP协议比较:在Node.JS中UDP服务器和客户端通信示例

UDP/TCP比较

用户数据报协议(User Datagram Protocol,UDP)和TCP协议一样,都在传输层,位于IP协议之上。TCP是一个面向连接的协议,它在网络节点之间提供可靠有序的数据流。与TCP不同,UDP允许你向其它主机发送消息(数据报),而不需要提前建立连接。由于UDP的无状态性,不用像TCP那样面向连接,所以UDP相对轻量,这对于服务器响应来向大量客户端的查询非常有用。与TCP相比,UDP的另一个优势是支持消息的广播和多多播。在Node.js中,dgram模块用来支持和实现UDP用户数据报协议。

TCPUDP

是否连接面向连接面向非连接

传输可靠性可靠的不可靠的

应用场合传输大量的数据少量数据

速度慢快

当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,TCP协议是当然的选择。当强调传输性能而不是传输的完整性时,如:音频和多媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择,如:DNS交换。把SNMP建立在UDP上的部分原因是设计者认为当发生网络阻塞时,UDP较低的开销使其有更好的机会去传送管理数据。TCP丰富的功能有时会导致不可预料的性能低下。

构建UDP服务器

构建一个UDP Socket套接字对象使用dgram.createSocket()方法,这个方法返回的Socket套接字对象,可以监听一个网络端口,从而启动一个UDP服务器,

var dgram = require('dgram')

var server = dgram.createSocket('udp4')

server.on('error', function (err) {

console.log(`server error:\n${err.stack}`);

server.close();

});

server.on('message', function (msg, rinfo) {

console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);

//通知客户端我已经收到

server.send('received: ' + msg.toString(), rinfo.port, rinfo.address)

});

server.on('listening', function () {

var address = server.address();

console.log(`server listening ${address.address}:${address.port}`);

});

server.bind(4064);

在上面的示例代码中,创建一个UDP的服务端,这个服务端会监听 4064 端口。 当接到到消息时发送成功给客户端。

构建UDP客户端

var dgram = require('dgram')

var server = dgram.createSocket('udp4')

var client = dgram.createSocket('udp4')

var model = { username: 'ourjs' }

client.send(Buffer.from(JSON.stringify(model)), 4064, 'localhost', function (err) {

console.log(err)

})

client.on('message', function(msg) {

console.log('message:', msg.toString())

})

上面的客户端代码会将数据发送到UDP服务器,收到服务器的回复后会在控制台打印收到的数据。

补充:UDP广播消息有些时侯,我们可能并不知道局域网内服务器IP地址,此时可以向 255.255.255.255 全网段发送一条广播消息,服务器接收到以后立即将消息返回,客户端自然就知道服务器IP了,广播的发送与客户端普通消息非常类似:

var dgram = require("dgram");

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

client.bind(function () {

client.setBroadcast(true);

});

var model = { username: 'broadcast' }

client.send(Buffer.from(JSON.stringify(model)), 4064, '255.255.255.255', function (err) {

console.log(err)

})

client.on('message', function(msg, ipdr) {

console.log('message:', msg.toString())

console.log('address:', ipdr) //服务器 IP 地址

})

执行结果:

$ node udp.broadcast.js

null

message: received: {"username":"broadcast"}

address: { address: '10.10.10.162', family: 'IPv4', port: 4064, size: 34 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值