控制台应用程序相互通信的推荐方式是什么?

2024-02-13

我有一个用 C# 编写的控制台应用程序系统,在不同的机器上运行。我用的是MSMQ。

我的问题是,如何使我的控制台应用程序相互通信?

我这样问是因为我想创建一个新的控制台应用程序,其他应用程序可以查询该应用程序以了解 MSMQ 中的消息数量。

编辑1: 感谢您的回复和评论! 关于要求,我估计大约每秒 10-50 次查询


您需要使用管道来实现此目的:请参阅命名管道和匿名管道 http://msdn.microsoft.com/en-us/library/system.io.pipes.pipestream.aspx

管道的工作原理如下: 主机应用程序(启动控制台应用程序的应用程序)必须创建一个管道来捕获控制台应用程序的 std 输出,并创建另一个管道来写入控制台应用程序的 std 输入。

我给你的链接中有很多代码示例

这里还有一个代码示例(使用现有的管道 StandardInput 和 StandardOutput):它启动一个 cmd.exe 控制台,但它是一层:不是实际的控制台......自己看看:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        private static StreamReader reader;

        static void Main(string[] args)
        {
            Process cmd = new Process();

            cmd.StartInfo.FileName = "cmd.exe";
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.UseShellExecute = false;

            cmd.Start();

            reader = cmd.StandardOutput;
            StreamWriter writer = cmd.StandardInput;


            Thread t = new Thread(new ThreadStart(writingThread));

            t.Start();

            //Just write everything we type to the cmd.exe process
            while (true) writer.Write((char)Console.Read());

        }

        public static void writingThread()
        {
            //Just write everything cmd.exe writes back to our console
            while (true) Console.Write((char)reader.Read());
        }
    }
}

您可以通过将 StreamReader 和 StreamWriter 替换为端口连接(套接字)缓冲区来实现相同的结果,以实现两个进程之间的远程通信http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx

建议确保通信安全以尽量减少入侵可能性

这是通过套接字进行通信的示例...现在它在一个程序中运行,但所有内容都在单独的线程上,如果通信是在两台单独的机器上,它将工作:服务器是控制进程 cmd 的服务器。 exe,客户端是查看器/写入器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Net.Sockets;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        private static StreamReader reader;
        private static StreamWriter writer;

        static void Main(string[] args)
        {
            //Server initialisation 

            Process cmdServer = new Process();

            cmdServer.StartInfo.FileName = "cmd.exe";
            cmdServer.StartInfo.RedirectStandardInput = true;
            cmdServer.StartInfo.RedirectStandardOutput = true;
            cmdServer.StartInfo.UseShellExecute = false;

            cmdServer.Start();

            reader = cmdServer.StandardOutput;
            writer = cmdServer.StandardInput;


            Thread t1 = new Thread(new ThreadStart(clientListener));
            t1.Start();
            Thread t2 = new Thread(new ThreadStart(clientWriter));
            t2.Start();
            Thread t3 = new Thread(new ThreadStart(serverListener));
            t3.Start();
            Thread t4 = new Thread(new ThreadStart(serverWriter));
            t4.Start();


        }

        public static void clientWriter()
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            Int32 size = 0;
            Byte[] buff = new Byte[1024];

            sock.Connect(IPAddress.Parse("127.0.0.1"), 4357);
            Console.WriteLine("clientWriter connected");

            while (true)
            {
                String line = Console.ReadLine();
                line += "\n";
                Char[] chars = line.ToArray();
                size = chars.Length;
                if (size > 0)
                {
                    buff = Encoding.Default.GetBytes(chars);
                    //Console.WriteLine("Sending \"" + new String(chars, 0, size) + "\"");
                    sock.Send(buff, size, 0);
                }
            }
        }

        /// <summary>
        /// Local client that listens to what the server sends on port 4356
        /// </summary>
        public static void clientListener()
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            sock.Bind(new IPEndPoint(IPAddress.Any, 4356));
            sock.Listen(0);

            Int32 size = 0;
            Byte[] buff = new Byte[1024];
            Char[] cbuff = new Char[1024];

            while (true)
            {
                Console.WriteLine("clientListener Waiting for connection");
                sock = sock.Accept();
                Console.WriteLine("clientListener Connection accepted " + ((sock.Connected)?"Connected" : "Not Connected"));

                while ((size = sock.Receive(buff)) > 0)
                {
                    for (int i = 0; i < size; i++) cbuff[i] = (Char)buff[i];
                    Console.Write(cbuff, 0, size);
                }

                sock.Close();

            }
        }

        /// <summary>
        /// Remote server that listens to what the client sends on port 4357
        /// </summary>
        public static void serverListener()
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            sock.Bind(new IPEndPoint(IPAddress.Any, 4357));
            sock.Listen(0);

            Int32 size = 0;
            Byte[] buff = new Byte[1024];
            Char[] cbuff = new Char[1024];

            while (true)
            {
                Console.WriteLine("serverListener Waiting for connection");
                sock = sock.Accept();
                Console.WriteLine("serverListener Connection accepted " + ((sock.Connected) ? "Connected" : "Not Connected"));

                while ((size = sock.Receive(buff)) > 0)
                {
                    for (int i = 0; i < size; i++) cbuff[i] = (Char)buff[i];
                    //Console.WriteLine("Received \"" + new String(cbuff,0,size) + "\"");
                    writer.Write(cbuff, 0, size);
                }

            }
        }

        /// <summary>
        /// Remote server that writes the output of the colsole application through the socket
        /// </summary>
        public static void serverWriter()
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            Int32 size = 0;
            Byte[] buff = new Byte[1024];
            Char[] cbuff = new Char[1024];

            sock.Connect(IPAddress.Parse("127.0.0.1"), 4356);

            Console.WriteLine("serverWriter connected");

            while (true)
            {
                size = reader.Read(cbuff, 0, 1024);
                if (size > 0)
                {
                    for (int i = 0; i < size; i++) buff[i] = (Byte)cbuff[i];
                    sock.Send(buff, 0, size, 0);
                }
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

控制台应用程序相互通信的推荐方式是什么? 的相关文章

随机推荐

  • SSIS 2012 和 SAP HANA

    有谁知道是否可以使用 SSIS 2012 将数据导入 或导出 SAP HANA 我在网上查了一下 似乎找不到太多关于两人合作的信息 我知道 SAP Data Services 是 HANA 推荐的 ETL 工具 但如果可能的话 我们希望尝试
  • 设置 jupyter 笔记本主题后工具栏不可见

    当我从笔记本调用并加载主题时 工具栏和笔记本名称不显示 我可以使用代码从笔记本加载主题 但我不确定如何使用类似的开关 T and N用于调用工具栏和笔记本名称 我在代码单元中使用了以下内容 from jupyterthemes import
  • 从内部作用域访问外部作用域

    我有一个看起来有点像这样的类型 var x function this y function this z function this A function CALLING POINT 从调用点 我尝试调用函数 this y 我不需要传递任
  • Node JS 读取缓冲数据

    由于某种原因 当我向端口发送消息并尝试通过缓冲区读取它时 它总是挂起socket on end 似乎永远无法达到 有任何想法吗 var net require net var buffer var server net createServ
  • Android监听应用程序中的所有事件

    我想监听手机上的所有用户事件 例如onTouch onClick onMenuItemClickedETC 为此 我创建了一个扩展活动的超级类 所有活动都从该类扩展 public class TopActivity extends Acti
  • 如何删除 MongoDB 中的 _id 并替换为另一个字段作为主键?

    我收藏了大量文件 我想从所有文档中删除自动生成的对象 ID id 键 并将其替换为另一个字段作为主键 我不明白为什么首先需要一个默认的对象 ID 在 mongodb 中 每个文档必须是唯一的 因此您需要一个唯一的字段来用作 id 如果您不提
  • 在原型中,如何将地图定义为自定义选项

    在我的原型文件中 我想将地图定义为自定义选项 尝试了一些方法 但没有一个起作用 我的元数据原型文件 syntax proto2 import google protobuf descriptor proto package com util
  • Android 中的滚动与 WebView 完美配合

    我有一个布局 我正在通过 WebView 在其中渲染 HTML 文档 XML 布局是
  • 如何重命名 ASP.NET 5 Web 项目中用作 Web 根目录的“wwwroot”文件夹

    我想将 ASP NET 5 项目中的 Web 根文件夹重命名为wwwroot 当我手动重命名该文件夹时 项目不再将其识别为 Web 根文件夹 项目属性页面不允许修改 Web 根目录 有没有办法重命名和 或重新分配 ASP NET 5 Web
  • 在 CSS 网格中从底部开始填充单元格

    我有一个 3 行的 CSS 网格 可能要填的项目还不到3个 我想从底部开始填 我创建了一个jsFiddle https jsfiddle net Lexogram vd7g4x5e 8 供你玩 但目前它无法达到我想要的效果 html bod
  • 在选项卡式窗口中显示输出

    我用 Java 为 Linux 开发了一个任务管理器 目前的输出显示在控制台中 而选项卡式窗口单独出现 这是使用 Java Swing 完成的 现在我希望控制台的输出显示在选项卡式窗口中 我该怎么做 有一些我用过的课程 一个用于任务管理器功
  • UITableView 滚动时单元格数据显示不正确

    我面临一些奇怪的问题 每当我滚动表格视图时 我的数据就会被其他单元格替换 每次 它都会被不同的单元格数据替换 我在这个替换中没有看到任何特定的模式 cell UITableViewCell alloc initWithStyle UITab
  • 如何将此node.js模块降级到特定版本并防止以后自动升级?

    我正在使用node js Nodemailer模块并遇到以下错误 错误 不支持的配置 将 Nodemailer 降级到 v0 7 1 或 请参阅迁移指南https github com andris9 Nodemailer migratio
  • HTML 详细信息/摘要元素标记样式

    我有一些 CSS 可以对详细信息元素中的摘要元素旁边的标记进行样式设置 CSS 本身工作得很好 但是 如果我在第一个详细信息元素中嵌套另一个详细信息元素 创建父详细信息元素和子详细信息元素 我的标记内容将无法正确切换 一旦我打开父元素 子标
  • Postcss - 颜色函数插件 - “无法从字符串解析颜色”

    使用以下 postcss 插件 postcss cssnext postcss 嵌套 postcss 颜色函数 使用以下颜色函数时 我经常遇到以下错误 Unable to parse color from string l 20 样式 cs
  • Winforms 到 WPF 的转换:BeginInvoke 到什么?

    这是我在 WinForms 中的旧代码 private void ValueChanged double inValue1 double inValue2 only manual mode for this driver so that s
  • 在没有循环的情况下找到两个向量中的最大值?

    如果有两个向量 比如说x and y for i in 1 length x z i max x i y i 你能帮我在不使用循环的情况下执行此操作吗 假设向量x and y具有相同的长度 pmax是你的函数 z pmax x y 如果长度
  • sql server中schema的重要性是什么?

    sql server中schema的重要性是什么 这个模式对我有什么帮助 出于安全原因这很重要吗 Yes SQL 模式的主要目的是促进安全管理 定义谁 哪些主体 可以访问什么 哪些数据库对象 从 SQL 2005 开始 当架构不再直接与所有
  • php shell exec wget 不在后台运行

    我想按如下方式运行 wget shell exec wget http somedomain com somefile mp4 sleep 20 continue my code 我想要的是让 PHP 等待 shell exec wget
  • 控制台应用程序相互通信的推荐方式是什么?

    我有一个用 C 编写的控制台应用程序系统 在不同的机器上运行 我用的是MSMQ 我的问题是 如何使我的控制台应用程序相互通信 我这样问是因为我想创建一个新的控制台应用程序 其他应用程序可以查询该应用程序以了解 MSMQ 中的消息数量 编辑1