如何接收C# WebSocket实时数据并在Node.js服务端写入更新JSON文件
从C# WebSocket获取实时数据并通过Node.js写入更新JSON文件实现方案
1. C# WebSocket 客户端实现
你可以用.NET 自带的ClientWebSocket类作为客户端,连接Node.js的WebSocket服务并推送实时数据,无需额外引入第三方包:
using System; using System.Net.WebSockets; using System.Text; using System.Text.Json; using System.Threading; using System.Threading.Tasks; namespace WebSocketDataSender { class Program { // 替换为你的Node.js WebSocket服务地址 private const string NodeWsUrl = "ws://localhost:8080"; private static readonly JsonSerializerOptions JsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; static async Task Main(string[] args) { using var wsClient = new ClientWebSocket(); await wsClient.ConnectAsync(new Uri(NodeWsUrl), CancellationToken.None); Console.WriteLine("已连接到Node.js WebSocket服务"); // 模拟实时数据源,你可以替换为实际业务数据 while (wsClient.State == WebSocketState.Open) { var realTimeData = new { Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(), Value = new Random().Next(1, 100), // 补充你的其他业务字段 DeviceId = "device_001" }; // 序列化为JSON字符串发送 var jsonStr = JsonSerializer.Serialize(realTimeData, JsonOptions); var buffer = Encoding.UTF8.GetBytes(jsonStr); await wsClient.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None); Console.WriteLine($"已发送数据: {jsonStr}"); // 调整发送频率,根据你的实际需求修改 await Task.Delay(1000); } } } }
2. Node.js WebSocket 服务端实现
服务端用ws库实现WebSocket服务,接收C#端推送的数据后直接更新本地JSON文件,每次写入用新数据覆盖旧内容即可保证JSON文件始终是最新数据:
2.1 初始化依赖
执行以下命令安装依赖:
npm init -y npm install ws
2.2 服务端代码
const WebSocket = require('ws'); const fs = require('fs/promises'); const path = require('path'); // 配置项 const WS_PORT = 8080; // 输出的JSON文件路径 const OUTPUT_JSON_PATH = path.join(__dirname, 'real-time-data.json'); // 启动WebSocket服务 const wss = new WebSocket.Server({ port: WS_PORT }); console.log(`WebSocket服务已启动,端口: ${WS_PORT}`); wss.on('connection', (ws) => { console.log('C#客户端已连接'); ws.on('message', async (data) => { try { // 解析收到的JSON数据 const realTimeData = JSON.parse(data.toString()); console.log('收到实时数据:', realTimeData); // 写入JSON文件,直接覆盖旧内容保证数据最新 await fs.writeFile(OUTPUT_JSON_PATH, JSON.stringify(realTimeData, null, 2), 'utf-8'); console.log('JSON文件已更新'); } catch (err) { console.error('处理数据失败:', err.message); } }); ws.on('close', () => { console.log('C#客户端已断开连接'); }); }); wss.on('error', (err) => { console.error('WebSocket服务错误:', err); });
注意事项
- 如果需要保留历史数据而非全量覆盖,可以修改Node.js端逻辑:先读取原有JSON文件的数组内容,把新数据push进数组后再写入
- 高频数据更新场景下可以加防抖逻辑,比如合并100ms内的多次更新只做一次文件写入,减少磁盘IO开销
- 生产环境建议增加数据校验规则,避免非法格式的数据写入文件
- 两端需要提前约定统一的数据结构,避免JSON解析失败
内容的提问来源于stack exchange,提问作者Vinitha Kumar
相关产品推荐
相关产品推荐

