You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET WinForm应用向Electron应用发送数据的实现方案求助

解决.NET WinForm向Electron应用发送TCP数据的问题

我来帮你搞定这个跨进程通信的问题,其实用原生TCP实现反而比node-ipc更直接可靠,毕竟你已经计划用TCP端口了。下面给你适配你指定版本(Node 8.11.1、Electron 1.7.10)的完整示例,分两端来写:

Electron(Node.js)端 TCP 服务端实现

在Electron的主进程(main.js)里编写TCP服务端,因为老版本Electron的渲染进程可能有沙箱限制,主进程直接用Node.js的net模块更稳妥,不用额外安装依赖:

// main.js - Electron主进程代码
const { app } = require('electron');
const net = require('net');

// 创建TCP服务器实例
const tcpServer = net.createServer((clientSocket) => {
  console.log('✅ .NET WinForm客户端已连接');

  // 监听来自.NET的数据
  clientSocket.on('data', (rawData) => {
    // 将二进制数据转为UTF-8字符串,去除首尾空白
    const receivedMsg = rawData.toString('utf8').trim();
    console.log('📥 收到.NET数据:', receivedMsg);
    
    // 如果你需要把数据传给渲染进程,可以用IPC发送
    // 比如:mainWindow.webContents.send('tcp-message', receivedMsg);
  });

  // 处理客户端断开连接
  clientSocket.on('end', () => {
    console.log('❌ .NET客户端已断开连接');
  });

  // 捕获Socket错误
  clientSocket.on('error', (err) => {
    console.error('⚠️ Socket错误:', err.message);
  });
});

// 启动服务器,监听本地127.0.0.1的3000端口(端口可以自行修改)
tcpServer.listen(3000, '127.0.0.1', () => {
  console.log('🚀 TCP服务器已启动,监听端口3000');
});

// 关闭Electron时自动停止TCP服务器
app.on('before-quit', () => {
  tcpServer.close(() => {
    console.log('🛑 TCP服务器已关闭');
  });
});

注意事项:

  • 确保端口3000没有被其他程序占用,否则会启动失败;
  • Electron 1.7.10和Node 8.11.1的net模块完全兼容,无需额外安装包;
  • 可以通过Electron的开发者工具(Ctrl+Shift+I)查看主进程的日志输出,确认服务器状态。

.NET WinForm端 TCP 客户端实现

在WinForm项目里用TcpClient类实现数据发送,以下是一个带按钮点击发送的示例:

// Form1.cs - WinForm客户端代码
using System;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;

namespace WinFormTcpSender
{
    public partial class Form1 : Form
    {
        private TcpClient _tcpClient;

        public Form1()
        {
            InitializeComponent();
            // 初始化TCP客户端实例
            _tcpClient = new TcpClient();
        }

        // 发送数据按钮点击事件
        private async void btnSend_Click(object sender, EventArgs e)
        {
            try
            {
                // 如果未连接,先尝试连接Electron服务器
                if (!_tcpClient.Connected)
                {
                    await _tcpClient.ConnectAsync("127.0.0.1", 3000);
                }

                // 获取要发送的内容(这里假设你有一个txtInput的文本框)
                string sendContent = txtInput.Text.Trim();
                if (string.IsNullOrEmpty(sendContent))
                {
                    MessageBox.Show("请输入要发送的数据!");
                    return;
                }

                // 将字符串转为UTF-8字节数组,添加换行符方便Electron端识别完整消息
                byte[] dataBytes = Encoding.UTF8.GetBytes(sendContent + Environment.NewLine);

                // 获取网络流并发送数据
                NetworkStream stream = _tcpClient.GetStream();
                await stream.WriteAsync(dataBytes, 0, dataBytes.Length);

                MessageBox.Show("数据发送成功!");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"发送失败:{ex.Message}");
                // 连接失败时重置TCP客户端
                _tcpClient.Dispose();
                _tcpClient = new TcpClient();
            }
        }

        // 窗体关闭时清理TCP连接
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (_tcpClient.Connected)
            {
                _tcpClient.Close();
            }
            _tcpClient.Dispose();
        }
    }
}

注意事项:

  • 确保添加System.Net.Sockets的引用;
  • 使用异步方法(ConnectAsyncWriteAsync)避免阻塞WinForm的UI线程;
  • 添加换行符是因为TCP是流式传输,Electron端的data事件可能会分段接收消息,换行符可以作为消息的结束标记;
  • 如果需要持续保持连接,可以复用_tcpClient实例,不用每次发送都新建。

调试与排查技巧

  1. 先启动Electron应用,查看主进程日志确认服务器已启动;
  2. telnet 127.0.0.1 3000命令测试端口是否可访问,排除端口占用或防火墙问题;
  3. .NET端捕获异常后,根据错误信息定位问题(比如“连接被拒绝”说明Electron服务器没启动,“超时”说明网络不通);
  4. 如果你之前用node-ipc失败,大概率是老版本Electron和.NET的IPC机制兼容性问题,原生TCP则没有这个限制,更适合跨技术栈通信。

内容的提问来源于stack exchange,提问作者Mahesh More

火山引擎 最新活动