You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何接收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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:36:03