feat: 添加 UDP 客户端模块
This commit is contained in:
@@ -14,6 +14,10 @@ import {
|
|||||||
initTrayItems,
|
initTrayItems,
|
||||||
} from './tray';
|
} from './tray';
|
||||||
|
|
||||||
|
import {
|
||||||
|
initUdpClient,
|
||||||
|
} from './udp-client';
|
||||||
|
|
||||||
import icon from '../../resources/icon.png?asset';
|
import icon from '../../resources/icon.png?asset';
|
||||||
import process from 'process';
|
import process from 'process';
|
||||||
|
|
||||||
@@ -71,6 +75,7 @@ app.whenReady().then(() => {
|
|||||||
|
|
||||||
createWindow();
|
createWindow();
|
||||||
initTrayItems();
|
initTrayItems();
|
||||||
|
initUdpClient();
|
||||||
|
|
||||||
app.on('activate', function () {
|
app.on('activate', function () {
|
||||||
// On macOS it's common to re-create a window in the app when the
|
// On macOS it's common to re-create a window in the app when the
|
||||||
|
102
src/main/udp-client.js
Normal file
102
src/main/udp-client.js
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
import { createSocket } from 'dgram';
|
||||||
|
|
||||||
|
/** 模块名称 */
|
||||||
|
const MODULE_NAME = '[udp-client]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc Socket 对象
|
||||||
|
* @type { import('dgram').Socket }
|
||||||
|
*/
|
||||||
|
let instance = null;
|
||||||
|
|
||||||
|
/** 初始化 UDP 客户端 */
|
||||||
|
export function initUdpClient() {
|
||||||
|
|
||||||
|
// 创建对象
|
||||||
|
instance = createSocket('udp4');
|
||||||
|
|
||||||
|
// 监听事件:异常
|
||||||
|
instance.on('error', function (error) {
|
||||||
|
console.error('-'.repeat(32));
|
||||||
|
console.error(MODULE_NAME, '出现异常:');
|
||||||
|
console.error(String(error));
|
||||||
|
console.error('-'.repeat(32));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 监听事件:端口监听
|
||||||
|
instance.on('listening', function () {
|
||||||
|
let info = instance.address();
|
||||||
|
console.info(MODULE_NAME, `端口监听成功,地址 ${info.address},端口 ${info.port}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 监听事件:消息
|
||||||
|
instance.on('message', function (message, remote) {
|
||||||
|
|
||||||
|
let { address: rAddress, port: rPort } = remote;
|
||||||
|
|
||||||
|
let msgStr = String(message);
|
||||||
|
|
||||||
|
console.info('-'.repeat(32));
|
||||||
|
console.info(MODULE_NAME, `收到消息 | 地址:${rAddress} | 端口:${rPort}`);
|
||||||
|
console.info(msgStr);
|
||||||
|
console.info('-'.repeat(32));
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// 绑定端口,初始化
|
||||||
|
instance.bind(0, function () {
|
||||||
|
try {
|
||||||
|
instance.setBroadcast(false);
|
||||||
|
instance.setMulticastTTL(128);
|
||||||
|
// instance.addMembership('');
|
||||||
|
// instance.setMulticastInterface('');
|
||||||
|
} catch (error) {
|
||||||
|
console.error(MODULE_NAME, '更新配置失败:');
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 发送消息(ASCII)
|
||||||
|
* @param {object} options
|
||||||
|
* @param {string} options.data 消息内容
|
||||||
|
* @param {string} options.ip 目标地址
|
||||||
|
* @param {number} options.port 目标端口
|
||||||
|
*/
|
||||||
|
export function sendMessage(options = {}) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (!instance) {
|
||||||
|
console.error(MODULE_NAME, '消息发送失败:未初始化');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let { data, ip, port } = options;
|
||||||
|
|
||||||
|
let buffer = Buffer.from(data, 'ascii');
|
||||||
|
|
||||||
|
console.info('-'.repeat(32));
|
||||||
|
console.info(MODULE_NAME, `发送消息 | 地址:${ip} | 端口:${port}`);
|
||||||
|
console.info(data);
|
||||||
|
console.info('-'.repeat(32));
|
||||||
|
|
||||||
|
// 发送消息
|
||||||
|
instance.send(buffer, port, ip, (error) => {
|
||||||
|
if (error) {
|
||||||
|
console.error('-'.repeat(32));
|
||||||
|
console.error(MODULE_NAME, '消息发送失败:');
|
||||||
|
console.error(String(error));
|
||||||
|
console.error('-'.repeat(32));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('-'.repeat(32));
|
||||||
|
console.error(MODULE_NAME, '消息发送异常:');
|
||||||
|
console.error(String(error));
|
||||||
|
console.error('-'.repeat(32));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user