前言
我们知道Internet传输层提供的传输服务有两种: TCP服务和UDP服务;
TCP服务的特点在于,面向连接,是一种基于连接的协议,在进行通信之前,首先要求客户机与服务器进程之间建立连接,从而进行可靠传输;UDP的特点在于无连接,即在通信之前不需要建立客户机与服务器进程间的联系,是一种面向非连接的协议,可以直接把数据包发送给对方;基于这个原因,UPD也是一种不可靠的协议,但是其传输速度比TCP更快,因此更适用于实时通信的场合。
使用dgram模块实现基于UDP的数据通信
一、python搭建UDP发送消息
1.创建套接字
2.使用套接字收/发数据
3.关闭套接字
# 引入套接字模块
import socket
import configparser
ip = "localhost"
port = 2021
numId = "D100001"
# 创建UDP套接字 Socket socket.AF_INET 服务器之间网络通信 socket.SOCK_DGRAM 数据报式socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送UDP数据
udp_socket.sendto(bytes('{"action":"intru","numId":"'+numId+'"}', encoding="utf-8"), (ip, port))
# 关闭套接字
udp_socket.close()
# 接受TCP套接字的数据
# data = udp_socket.recv(4096)
# print(data.decode("utf-8"))
二、Nodejs搭建UDP服务器
在Node.js中,提供了dgram模块,用于创建UPD服务器与客户端,以及实现UDP服务器与客户端之间的通信。
var dgram = require('dgram');
var udp_server = dgram.createSocket('udp4'); //创建 udp server
udp_server.bind(2021); // 绑定端口
let python_socket = {};
// 监听端口
udp_server.on('listening', function () {
console.log('udp server linstening 2021.');
})
//接收消息
udp_server.on('message', function (msg, rinfo) {
console.log("message on the python :" + typeof (msg) + " msg : " + msg);
//本身就是Object,有时又不是;需要具体分析出来--只在connect的时候才是字符串,json字符串创建对象
var msg_python = JSON.parse(msg.toString())
var id = msg_python.numId.toString() || "D100001";
//rinfo.address 属性值为发送者所使用的地址 socket端口号 当前时间Date
python_socket[id] = { address: rinfo.address, port: rinfo.port, timeStamp: new Date() };
console.log("socket_python:", python_socket[id]);
switch (msg_python.action) {
var date = new Date();
case "intru":
console.log("---------------------intru--------------------------")
console.log("from python ", JSON.stringify(msg_python));
break;
default:
console.log("---------------------other--------------------------");
console.log("python_socket :" + JSON.stringify(msg_python) + date );
break;
}
})
//错误处理
udp_server.on('error', function (err) {
console.log('some error on udp server.')
udp_server.close();
})