Node.js 和 .net 之间的命名管道通信

Mou*_*ars 4 .net ipc named-pipes node.js

我正在处理 .net (v4.5.2) 和 Javascript node.js (v8.9.0) 应用程序之间的进程间通信。我想为此使用 Windows 命名管道(并且仅使用命名管道)。对于 Javascript 应用程序,我使用了命名管道包 (v0.0.1) 我能够在两个应用程序之间建立连接,这告诉我我在这里并没有完全偏离基础。每当我向 NamedPipeServerStream 写入字符串但未收到数据时,我希望看到在 JavaScript 应用程序中触发数据事件。我无法接收任何数据。这是 .net 和 JavaScript 应用程序的代码。任何想法,为什么不触发数据事件?

.Net 代码

using System;
using System.IO;
using System.IO.Pipes;

namespace NamedPipes
{
    class Program
    {
        static void Main(string[] args)
        {
            var server = new NamedPipeServerStream("XYZNamedPipe");

            Console.WriteLine("Waiting for Connection");
            server.WaitForConnection();
            Console.WriteLine("Connection Established");
            StreamWriter writer = new StreamWriter(server);

            int cnt = 0;
            while (true)
            {
                string line = Console.ReadLine();
                writer.WriteLine(++cnt.ToString() + ": " + line);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

JavaScript 代码

var NamedPipes = require("named-pipes");
pipe = NamedPipes.connect('XYZNamedPipe')

pipe.on('connect', (str) => {
    console.log('connection established'); 
});

pipe.on('data', (str) => {
    console.log('data received');   
    console.log(str); 
});

pipe.on('end', (str) => {
    console.log('end');       
});
Run Code Online (Sandbox Code Playgroud)

Ber*_*ero 6

没有触发数据事件的原因有两个:

  1. “命名管道”包在内部创建子管道。如果您使用相同的程序包创建服务器,则此程序包易于使用。但在这种情况下,管道服务器是通过 .net 应用程序创建的。所以在 javascript 代码中你最好使用 Node.js 的“net”模块连接到服务器。

  2. 在 .net 应用程序中,您不应创建新的 StreamWriter。只需使用服务器实例的 write 方法。NamedPipeServerStream 实现了 IDisposable,因此最好将其放在 using 块中。

.Net 代码

  static void Main(string[] args)
    {
        using (NamedPipeServerStream server = new NamedPipeServerStream("XYZNamedPipe"))
        {
            Console.WriteLine("Waiting for Connection");
            server.WaitForConnection();
            Console.WriteLine("Connection Established");

            int cnt = 0;
            while (true)
            {
                string line = Console.ReadLine();
                byte[] messageBytes = Encoding.UTF8.GetBytes((++cnt).ToString() + ": " + line);
                server.Write(messageBytes, 0, messageBytes.Length);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

JavaScript 代码

const net = require('net');

const PIPE_NAME = 'XYZNamedPipe';
const PIPE_PATH = '\\\\.\\pipe\\';

const client = net.createConnection(PIPE_PATH + PIPE_NAME, () => {
  console.log('connected to server!');
});

client.on('data', (data) => {
  console.log(data.toString());
});

client.on('end', () => {
  console.log('disconnected from server');
});
Run Code Online (Sandbox Code Playgroud)