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

时间:2017-11-10 21:40:21

标签: .net node.js ipc named-pipes

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

.Net Code

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);
            }
        }
    }
}

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');       
});

1 个答案:

答案 0 :(得分:1)

有两个原因,即未触发数据事件的原因:

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

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

  3. .Net Code

      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);
                }
            }
        }
    

    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');
    });