用nodejs编写UDP服务端,uniapp开发安卓APP客户端UDP
服务端效果图:
客户端效果图:
UDP广播服务端 nodejs 代码:
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
server.on('close',()=>{
console.log('socket已关闭');
});
server.on('error',(err)=>{
console.log(err);
});
server.on('listening',()=>{
console.log('socket正在监听中...');
server.setBroadcast(true);//开启广播
server.setTTL(128);//路由一跳TTL减一,减到零抛弃数据包
//server.send('hello i am server',8061,'192.168.1.255');
//在send {msg=close} 可以发送 colse 事件
});
//通过message事件接收数据,
server.on('message',(msg,rinfo)=>{
console.log(`receive message from ${
rinfo.address}:${
rinfo.port}`);
var newtopic = new Buffer.from(msg,"utf-8").toString();//将十六进制的消息转换成string
console.log(newtopic)
//给客户端回消息
server.send('Hi Client',8061,'192.168.1.255');
});
//绑定本机的端口和ip地址,要接收数据的话必须绑定
server.bind('8060','192.168.1.196');
UDP广播客户端 uniapp源码:
//引入需要用到的安卓包
var DatagramPacket = plus.android.importClass('java.net.DatagramPacket'); //udp接收信息引用的java类
var DatagramSocket = plus.android.importClass('java.net.DatagramSocket'); //udp创建udp引用java类
var InetAddress = plus.android.importClass('java.net.InetAddress'); //绑定ip引用java类
var NetworkInterface = plus.android.importClass('java.net.NetworkInterface'); //获取主机ip
var JString = plus.android.importClass('java.lang.String'); //字符串转换类
var socket;
var port = 8060; //广播端口
var getPort = 8061; //本机端口
var timeout = 6000; //超时时间
try {
if (DatagramSocket == undefined) {
return;
}
// 创建广播地址
var ip = InetAddress.getByName("192.168.1.255");
// 绑定本机接收UDP反馈消息的端口号
socket = new DatagramSocket(getPort);
// 设置接收超时时长
socket.setSoTimeout(timeout);
// 发送广播数据
var sendData = Array.prototype.slice.call((new Buffer(`hello server`)), 0);
var sendPacket = new DatagramPacket(sendData, sendData.length, ip, port);
console.log('广播地址:'+ip.getHostAddress(), '端口号:'+sendPacket.getPort())
socket.send(sendPacket);
// 接收数据
var isReceive = true;
while (isReceive) {
try {
// 设置接收缓存,需要用0填充,否则为 null 无法接收。
var buffer = new Array(1024).fill(0);
var packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
var data = new JString(packet.getData()).trim();
if (data.length == 0) {
// 接收超时,结束接收
isReceive = false;
} else {
console.log('=====收到数据======', data);
}
} catch (ex) {
socket.close();
isReceive = false;
console.log('接收数据失败')
}
}
} catch (ex) {
console.log('========出错了=======', ex);
} finally {
if (socket != undefined) {
socket.close();
}
}
参考文章:https://my.oschina.net/u/4004226/blog/5125863