ELSE

Node.js 利用 stdio 标准输入/输出实现与 C# 程

2020-08-12  本文已影响0人  野鸡没名
stdio 通讯方式

之前写过一篇文章 使用 C# 开发 node.js 插件 中实现原理是通过使用 C# 手写一个 web服务器 + Console.WriteLine() 的形式实现的通讯,也就是 http + stdout 组合的方式。

写完文章后我觉得自己是不是有些傻。为啥不用 stdin + stdout标准输入/输出流 的方式实现通讯,实现简单不说,还会规避一些可能的隐患;

  1. 比如 http 端口可能会被占用!
  2. 或者烦人的 windows defender 会弹出提示!
    windows defender
综上所述改进方案使用 stdio —— 简单、粗暴、直接、有效
/**
 * 通过 stdio 和 C# 实现通讯 
 */
const path = require('path');
const cp = require('child_process');

const handle = cp.spawn(path.join(__dirname, 'dist/NodeAddon_WithStdio.exe'));

handle.stdout.on('data', chunk => {
  console.log('<<', chunk.toString());
});

const msg = 'Hello C#';
console.log('>> node 发送数据:', msg);

handle.stdin.write(`${msg}\n`, error => {
  if (error) {
    console.log(error);
  }
});
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;

/// <summary>
/// 通过 stdio 和 node.js 实现通讯
/// </summary>
namespace NodeAddon_WithStdio
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.InputEncoding = Encoding.UTF8;
            Console.OutputEncoding = Encoding.UTF8;

            new Thread(new ThreadStart(StartStdioListener)).Start();
        }

        static void StartStdioListener()
        {
            string strin = Console.ReadLine();

            Console.WriteLine("C# 收到的数据: {0}", strin);
        }

    }
}
$ node test-stdio.js
>> node 发送数据: Hello C#
<< C# 收到的数据: Hello C#
上一篇 下一篇

猜你喜欢

热点阅读