nodejs + uniapp 开发安卓APP实现UDP广播

用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

Guess you like

Origin blog.csdn.net/weixin_38946164/article/details/119784423