Node.js与.Net之间的命名管道通信

Named Pipe Communication between Node.js and .net(Node.js与.Net之间的命名管道通信)
本文介绍了Node.js与.Net之间的命名管道通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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. "命名管道"包正在内部创建子管道。如果您使用相同的程序包创建服务器,则此程序包很容易使用。但在本例中,PIPE服务器是通过.Net应用程序创建的。因此,在Java代码中,最好使用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);
            }
        }
    }

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

这篇关于Node.js与.Net之间的命名管道通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
quot;Overflowquot; compiler error with -9223372036854775808L(编译器错误-9223372036854775808L(Q;溢出Q))
Visual Studio 2010 ReportViewer Assembly References(Visual Studio 2010 ReportViewer程序集引用)
Weird behaviour when I open a reportviewer in WPF(在WPF中打开报表查看器时出现奇怪的行为)
how do i pass parameters to aspnet reportviewer(如何将参数传递给aspnet report查看器)