当前位置: 首页 > news >正文

在一台电脑上实现网页与exe程序使用udp通信

要在同一台电脑上实现网页(前端)与 EXE 程序(后端)通过 UDP 通信,可以使用以下步骤。前端可以使用 JavaScript 通过 WebSocket 与自定义服务器进行通信,该服务器通过 UDP 发送和接收数据,再与 EXE 程序进行交互。由于浏览器本身不直接支持 UDP 通信,我们需要一个中间层来处理 UDP 数据传输。

以下是一个简单的示例,包括前端和后端代码。

前端(网页)

我们将使用 WebSocket 来与自定义服务器通信。

<!DOCTYPE html>  
<html lang="en">  
<head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>UDP Communication</title>  
</head>  
<body>  <h1>UDP Communication with EXE</h1>  <input type="text" id="message" placeholder="Enter message">  <button onclick="sendMessage()">Send Message</button>  <p id="response"></p>  <script>  const ws = new WebSocket('ws://localhost:8080');  ws.onopen = function(event) {  console.log('WebSocket is open now.');  };  ws.onmessage = function(event) {  document.getElementById('response').innerText = 'Received from EXE: ' + event.data;  };  ws.onclose = function(event) {  console.log('WebSocket is closed now.');  };  function sendMessage() {  const message = document.getElementById('message').value;  ws.send(message);  }  </script>  
</body>  
</html>

后端(Node.js 自定义服务器)

我们将使用 Node.js 创建一个 WebSocket 服务器,并使用 dgram 模块进行 UDP 通信。

 1.安装 Node.js 和必要的模块。

//cmd
npm install ws

2.创建 WebSocket 服务器与 UDP 客户端。

//javascriptconst WebSocket = require('ws');  
const dgram = require('dgram');  
const server = new WebSocket.Server({ port: 8080 });  const udpClient = dgram.createSocket('udp4');  // UDP 服务器地址和端口  
const udpServerAddress = '127.0.0.1';  
const udpServerPort = 41234;  udpClient.on('message', (msg, rinfo) => {  console.log(`UDP Message from ${rinfo.address}:${rinfo.port} - ${msg}`);  // 将从 EXE 程序接收到的消息通过 WebSocket 发送给网页  server.clients.forEach(client => {  if (client.readyState === WebSocket.OPEN) {  client.send(msg);  }  });  
});  udpClient.on('listening', () => {  const address = udpClient.address();  console.log(`UDP Client listening on ${address.address}:${address.port}`);  
});  udpClient.bind(41235); // UDP 客户端端口  server.on('connection', (ws) => {  console.log('New client connected');  ws.on('message', (message) => {  console.log(`Received message => ${message}`);  // 将从网页接收到的消息通过 UDP 发送给 EXE 程序  const buf = Buffer.from(message);  udpClient.send(buf, 0, buf.length, udpServerPort, udpServerAddress, (err) => {  if (err) {  console.error(err);  ws.close();  } else {  console.log('UDP message sent');  }  });  });  ws.on('close', () => {  console.log('Client has disconnected');  });  
});  console.log('WebSocket server is running on ws://localhost:8080');

详细参见:使用 Node.js 创建一个 WebSocket 服务器-CSDN博客 

EXE 程序(C# 示例)

以下是一个简单的 C# UDP 服务器示例,用于接收和发送 UDP 数据。

  1. 创建一个新的 C# 控制台应用程序。
  2. 使用以下代码:
//c#using System;  
using System.Net;  
using System.Net.Sockets;  
using System.Text;  class UdpServer  
{  static void Main()  {  UdpClient udpListener = new UdpClient(41234);  IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 41234);  try  {  while (true)  {  Console.WriteLine("Waiting for a connection...");  byte[] bytes = udpListener.Receive(ref groupEP);  string receivedData = Encoding.ASCII.GetString(bytes, 0, bytes.Length);  Console.WriteLine($"Received: {receivedData} from {groupEP}");  // 处理接收到的数据并发送响应  string response = "Hello from EXE";  byte[] sendBytes = Encoding.ASCII.GetBytes(response);  udpListener.Send(sendBytes, sendBytes.Length, groupEP);  }  }  catch (Exception e)  {  Console.WriteLine(e.ToString());  }  finally  {  udpListener.Close();  }  }  
}

 

运行步骤

  1. 启动 C# UDP 服务器。
  2. 启动 Node.js WebSocket 服务器。
  3. 打开网页并发送消息。

这样,网页上的消息会通过 WebSocket 发送到 Node.js 服务器,Node.js 服务器再通过 UDP 发送到 C# EXE 程序。C# EXE 程序处理完消息后,可以通过 UDP 发送响应,Node.js 服务器再通过 WebSocket 将响应发送到网页。

相关文章:

在一台电脑上实现网页与exe程序使用udp通信

要在同一台电脑上实现网页&#xff08;前端&#xff09;与 EXE 程序&#xff08;后端&#xff09;通过 UDP 通信&#xff0c;可以使用以下步骤。前端可以使用 JavaScript 通过 WebSocket 与自定义服务器进行通信&#xff0c;该服务器通过 UDP 发送和接收数据&#xff0c;再与 E…...

基于Java的GeoTools对Shapefile文件属性信息深度解析

目录 前言 一、Shapefile的属性列表信息 1、属性表格信息 2、属性表格包含的要素 二、GeoTools对属性表格的解析 1、常规解析方法 2、基于dbf文件的属性信息读取 三、总结 前言 ESRI Shapefile&#xff08;shp&#xff09;&#xff0c;或简称shapefile&#xff0c;是美…...

付费计量系统实体和接口(1)

13.System entities and interfaces 系统实体和接口 See also Clause 4 for a discussion on general concepts and Clause 5 for generic entity model. 参见条目 4 讨论总体概念、条目 5 通用实体模型。 An entity specification should specify the embodied functions and …...

网易博客旧文----bacnet学习系列之四----VTS的初步使用

bacnet学习系列之四----VTS的初步使用 2014-02-07 13:32:28| 分类&#xff1a; BACnet | 标签&#xff1a; |举报 |字号大中小 订阅 这是一个测试用 的工具&#xff0c;而且是开放源码的&#xff0c;下载地址为&#xff1a;VTS下载官网 也可以从我的网盘下载 VTS下载 我用的是…...

SpringIoC容器的初识

一、SpringIoC容器的介绍 Spring IoC 容器&#xff0c;负责实例化、配置和组装 bean&#xff08;组件&#xff09;。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这…...

队列的实现与讲解

一.概念与结构 1.概念 只允许在⼀端进行插⼊数据操作&#xff0c;在另⼀端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) ​ 入队列&#xff1a;进⾏插⼊操作的⼀端称为队尾 ​ 出队列&#xff1a;进⾏删除操作的⼀端称为队头 注意&…...

hbuilderx+uniapp+Android健身房管理系统 微信小程序z488g

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…...

自动驾驶-参考线生成

为什么要进行参考线生成&#xff1f; apollo在routing模块&#xff0c;已经得到的全局路径&#xff0c;但是其不能直接作为局部路径规划的参考线&#xff0c;这是因为&#xff1a; routing给出的全局路径过长&#xff1b;routing是基于高精地图给出的路径&#xff0c;高精地图…...

厂商资源分享网站

新华三&#xff08;H3C&#xff09;是一家中国知名的网络设备供应商&#xff0c;提供网络设备、网络解决方案和云计算服务。公司成立于2003年&#xff0c;是华为公司和惠普公司合资的企业&#xff0c;总部位于中国深圳。 华为&#xff08;Huawei&#xff09;是一家全球知名的电…...

【ONE·Web || HTML】

总言 主要内容&#xff1a;HTML基本知识入门&#xff0c;主要介绍了常见的一些标签使用&#xff0c;以及简单案例演示。       文章目录 总言0、前置说明1、认识HTML1.1、是什么1.2、初识 HTML 标签、HTML 文件基本结构1.2.1、相关说明1.2.2、vscode如何快速生成代码 2、HT…...

MongoDB的安装与增删改查基本操作

MongoDB是一种非关系型数据库,是NoSQL语言,但是又是最接近关系型数据库的。内部存储不是表结构,但是可以对数据进行表结构的操作。 一、安装 在官网:Download MongoDB Community Server | MongoDB下载系统对应的版本进行安装即可 二、编辑器 在安装MongoDB后会自带一个编…...

Python水循环标准化对比算法实现

&#x1f3af;要点 算法区分不同水循环数据类型&#xff1a;地下水、河水、降水、气温和其他&#xff0c;并使用相应标准化降水指数、标准化地下水指数、标准化河流水位指数和标准化降水蒸散指数。绘制和计算特定的时间序列比较统计学相关性。使用相关矩阵可视化集水区和显示空…...

【TypeScript】知识点梳理(一)

#国庆快乐&#xff01;来点干货~ # #项目中团队总结生产问题&#xff0c;40%是类型相关问题&#xff0c;可见TS的重要性与向好趋势# TS是JS的超集 类型 Number、String、Boolean 首字母大小写&#xff0c;类型有区别&#xff0c;譬如&#xff1a; string是基元&#xff08;原始…...

DMA方式在执行中断处理程序时不中断现行程序吗

DMA方式在执行中断处理程序时会中断现行程序&#xff0c;但DMA数据传输过程本身不中断现行程序。以下是对DMA方式及其中断处理程序的详细解释&#xff1a; DMA方式的基本特点 DMA&#xff08;Direct Memory Access&#xff0c;直接存储器存取&#xff09;方式是一种由硬件直接…...

Redis:string类型

Redis&#xff1a;string类型 string命令设置与读取SETGETMSETMGET 数字操作INCRINCRBYDECRDECRBYINCRBYFLOAT 字符串操作APPENDSTRLENGETRANGESETRANGE 内部编码intembstrraw 在Redis中&#xff0c;字符串string存储的是二进制&#xff0c;以byte为单位&#xff0c;输入的二进…...

【C++ STL】手撕vector,深入理解vector的底层

vector的模拟实现 前言一.默认成员函数1.1常用的构造函数1.1.1默认构造函数1.1.2 n个 val值的构造函数1.1.3 迭代器区间构造1.1.4 initializer_list 的构造 1.2析构函数1.3拷贝构造函数1.4赋值运算符重载 二.元素的插入,删除,查找操作2.1 operator[]重载函数2.2 push_back函数:…...

【Android】CarWatchDog I/O监控服务

Android Car WatchDog I/O监控服务 背景&#xff1a; 某基于Android 13的车载系统。 某天长时间测试一款3方&#xff08;非SystemApp&#xff09;时&#xff0c;该款应用偶发闪退现象。 通过日志分析&#xff0c;发现应用被系统的 Car WatchDog&#xff08;喂狗服务&#xff…...

如何使用 Django 框架进行用户认证的详细指南,涵盖用户注册和登录功能的实现。

当然!下面是关于如何使用 Django 框架进行用户认证的详细指南,涵盖用户注册和登录功能的实现。 掌握 Django 用户认证的艺术 Django 是一个强大的 Python Web 框架,以其灵活性和高效性著称。无论你是新手还是经验丰富的开发者,理解和实现用户认证都是 Web 开发中的一项核心…...

C++ 语言特性21 - 别名模板

一&#xff1a;概述 别名模板是 C11 引入的&#xff0c;用于为一个模板类型定义别名&#xff0c;从而简化复杂的模板类型定义。它结合了 using 关键字&#xff0c;可以对模板类型进行重新命名&#xff0c;使代码更加简洁和可读。 1. 作用 定义模板类型的别名。简化复杂的模板类…...

Jenkins pipeline配置示例

前提条件&#xff1a;已经安装Jenkins并能正常启动 如果Jenkins安装启动遇到问题可以参考&#xff1a; 1.创建pipeline 点击新建项目&#xff1a; 输入名称&#xff0c;选择pipeline&#xff1a; 进入配置页面&#xff0c;如果要配置GitHub Webhook要勾选&#xff1a;<fo…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...