之前写过一篇文章 使用 C# 开发 node.js 插件 中实现原理是通过使用 C#
手写一个 web服务器
+ Console.WriteLine()
的形式实现的通讯,也就是 http + stdout
组合的方式。
写完文章后我觉得自己是不是有些傻。为啥不用 stdin + stdout
纯 标准输入/输出流
的方式实现通讯,实现简单不说,还会规避一些可能的隐患;
- 比如 http 端口可能会被占用!
- 或者烦人的
windows defender
会弹出提示!
综上所述改进方案使用 stdio —— 简单、粗暴、直接、有效
- 完整代码
- 刚好最近又学习了一下
child_process
了解到子进程对象接收、输入标准流很方便 - Node.js 端
/**
* 通过 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);
}
});
- C# 端
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#