C# 管道通信 服务器

C#与C++交互开发系列(十八):跨进程通信之命名管道(Named Pipes) 在 C# 和 C++ 应用程序之间进行数据交换时,命名管道(Named Pipes)是一种简单高效的进程间通信(IPC)方式。命名管道提供了可靠的双向通信通道,适合用于同一台机器上的跨进程通信。本文将深入介绍如何在 C# 和 C++ 程序中使用命名管道进行数据传输,包括详细的示例代码,帮助读者在实践中使用并调试这一技术。命名管道是 Windows 提供的一种 IPC 机制,支持双向数据流。与匿名管道不同,命名管道可以跨进程、跨用户访问。 阅读详情



using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace 管道通信
{
    public partial class FrmMain : Form
    {
        /// <summary>
        /// 系统消息列表
        /// </summary>
        List<SysMessage> _sysMessages = new List<SysMessage>(); 

        /// <summary>
        /// 服务端管道
        /// </summary>
        private NamedPipeServerStream _serverStream;
        /// <summary>
        /// 客户端管道
        /// </summary>
        private NamedPipeClientStream _clientStream;

        /// <summary>
        /// 服务端读取数据线程
        /// </summary>
        private Thread _serverThread;

        public FrmMain()
        {
            InitializeComponent();

            _serverThread = new Thread(new ThreadStart(ServerReadThread));

            dataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            
            PushMessage("skdfjksjfksjfksjkfjskdfjksjfklsjfkjsklfjskljfk");
        }

        /// <summary>
        /// 压入消息
        /// </summary>
        /// <param name="message"></param>
        void PushMessage(string message)
        {
            _sysMessages.Add(new SysMessage(message));
        }

        /// <summary>
        /// 服务器读取数据线程
        /// </summary>
        private void ServerReadThread()
        {
            while (true)
            {
                try
                {
                    var buf = new byte[1024];
                    if (!_serverStream.IsConnected)
                    {
                        _serverStream.WaitForConnection();
                    }

                    var sr = new StreamReader(_serverStream);

                    var recData = sr.ReadLine();
                    ShowMessage("收到数据:"+recData);
                    if (recData == "Exit")
                    {
                        // Log.WriteLog("Pipe Exit.", _logFile);
                        Debug.WriteLine(recData);
                        // ExitApplication();
                    }
                }
                catch (Exception ex)
                {
                    break;
                    ShowMessage(ex.Message);
                }
               
                Thread.Sleep(200);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (_serverStream != null) return;

            _serverStream = new NamedPipeServerStream("pipe_xg",PipeDirection.InOut);
            _serverThread.Start();

            
            ShowMessage("管道建立成功!");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                _clientStream = new NamedPipeClientStream("pipe_xg");
                ShowMessage("打开建立成功");

            }
            catch (Exception ex)
            {
                ShowMessage(ex.Message);
            }

        }

        delegate void DShowMessage(string msg);
        /// <summary>
        /// 显示信息
        /// </summary>
        /// <param name="msg"></param>
        void ShowMessage(string msg)
        {
            PushMessage(msg);

            if (InvokeRequired)
            {
                Invoke(new DShowMessage(ShowMessage), new object[] {msg});
                return;
            }

            dataGridView1.DataSource = new List<NamedPipeServerStream> { _serverStream }.Select(obj => new
            {
                //CanRead = obj.CanRead,
                //TransmissionMode = obj.TransmissionMode,
                //WriteTimeout = obj.WriteTimeout,
                连接状态 = obj.IsConnected,
                //Position = obj.Position,
                //ReadMode = obj.ReadMode,
            }).ToList();

            label1.Text = msg;
        }

        /// <summary>
        /// 关闭清理 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (_serverThread != null) _serverThread.Abort();
            if (_serverStream != null) _serverStream.Close();
            if (_clientStream != null) _clientStream.Close();
        }

        /// <summary>
        /// 发送数据按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            if (_clientStream != null)
            {
                if(!_clientStream.IsConnected)
                _clientStream.Connect();

                if (_clientStream.IsConnected)
                {
                    var data = DateTime.Now.ToString(CultureInfo.InvariantCulture);
                    var writer = new StreamWriter(_clientStream);
                    writer.WriteLine(data);
                    writer.Flush();
                    //writer.Close();
                }
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (_clientStream != null) _clientStream.Close();
            ShowMessage("客户端连接断开");
        }

        /// <summary>
        /// 系统时钟,更新消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            dataGridView2.DataSource = _sysMessages.Select(obj => new
                {
                    消息索引 = obj.Index,
                    内容 = obj.Content,
                    时间 = obj.DateTime.ToString(CultureInfo.InvariantCulture),

                }).ToList();
        }
    }
}


C# 命名管道NamedPipeServerStream使用 是 .NET Framework 和 .NET Core 中提供的一个类,用于创建和操作命名管道的服务器端。命名管道是一种在同一台计算机上或不同计算机之间进行进程间通信的机制。命名管道允许两个或多个进程通过共享的管道进行通信。其中一个进程充当服务器,创建管道并等待客户端连接。其他进程充当客户端,连接到服务器创建的管道,并通过管道进行数据交换。类提供了创建命名管道服务器端的功能。它允许你指定管道的名称、方向(输入、输出或双向)和一些其他选项。类连接到该管道,并进行数据交换。 阅读详情

相关推荐

C#进程间通信的几种方式:管道通信

年底了,有了大把时间,终于着手尝试写写技术博客,跟大家交流下心得。 就从进程间通信相关的内容开始吧,在此对以往工作中用到的几种进程间通信方式做一下简单的总结。 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。进程间通信的方式(C/S结构开发环境)通常有管道、Socket、消息队列、信号量、共享存储、Streams等。 方式一:管道通...

dnazhd的博客 2万+

C#开发笔记:跨进程通讯之命名管道

命名通道是C#中实现进程间通信的重要机制之一,通过System.IO.Pipes命名空间提供了便捷的类库支持。使用命名通道可以有效地在本地计算机上进行安全和高效的进程间数据传输。

2201_76033684的博客 2802

C# 使用管道Pipe在进程间通信

进程间通信的一种方式,Pipes:管道,分为无名管道:在父子进程间交换数据;有名管道:可在不同主机间交换数据,分为服务器方和客户方,在Win9X下只支持有名管道客户。 1、进程间通信 2、管道Pipe通信

【C# 】Pipe管道通信使用

【C# 】管道通信使用

wangnaisheng的专栏 2223

c#管道通讯server与client代码

c#管道通讯的实例代码,是在能成功运行的工程中直接拷出来的,并且包含了server端与client端的代码,基本可以直接使用了

命名管道 程序间通信 适合本机 局域网 DotNetNamedPipes

命名管道 程序间通信 适合本机 局域网 DotNetNamedPipes

通过NamedPipe命名管道实现进程间通信(C#实现,包括客户端和服务端)

文章目录一、前言二、关于命名管道三、运行效果四、Demo工程源码五、核心代码 一、前言 最近在做一个这样的功能,Unity发布PC平台的客户端exe,在客户端exe中拉起浏览器exe(这个浏览器是自己使用winform实现的),浏览器内调用JsApi执行支付,支付结果会回调游戏服务端URL,服务端通过消息通知客户端exe,此时客户端exe通过进程间通信让浏览器exe关闭。 好了,进程间怎么通信呢? 实现进程间通信有很多中方案:管道(pipe)、命名管道(FIFO)、消息队列(MessageQueue)、共享

linxinfa的专栏 6685

Windows 10下用vcpkg一键搞定libcurl开发环境(Code::Blocks 20.03配置指南)

本文详细介绍了在Windows 10系统下使用vcpkg工具快速配置libcurl开发环境的完整指南,特别针对Code::Blocks 20.03 IDE进行优化设置。通过vcpkg自动化管理依赖项,简化libcurl的安装与配置过程,帮助开发者高效搭建网络通信功能开发环境,并提供了常见问题解决方案和实际项目中的最佳实践。

weixin_28040125的博客 249

C# VC 管道通信

C++和C#进程之间通过命名管道通信(上)<br />“命名管道”是一种简单的进程间通信(IPC)机制。命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。用命名管道来设计应用程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如TCP/IP或IPX)的知识。因为命名管道利用了微软网络提供者(MSNP)重定向器,通过一个网络,在各进程间建立通信。这样一来,应用程序便不必关心网络协议的细节。<br />命令管道是围绕Windows文件系统设

luxiaoyu_sdc的专栏 4790

保姆级教程:用PROGRAM_FTDI搞定Xilinx FPGA的JTAG调试器(基于FT232/FT2232/FT4232)

本文详细介绍了如何使用FT232/FT2232/FT4232系列芯片通过PROGRAM_FTDI工具配置Xilinx FPGA的JTAG调试器。从芯片选型、驱动安装到固件烧写和Vivado验证,提供了完整的实操指南和避坑要点,帮助开发者低成本实现高效调试。

weixin_29271053的博客 2155

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

随着文档处理需求的增加,格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性,将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件,提供了这样的转换功能,使得用户可以轻松地在Word和PDF之间进行转换。

ONLYOFFICE的官方博客 4569

C# 管道通信-命名管道(一)

最近在做一个应用程序,涉及到两个应用程序之间的通讯,就想到了用C#的命名管道的方式来实现,经过一番小折腾,总算实现了,现把一些主体的代码粘贴出来与大家分享:         管道通讯会涉及到client端和Server端,Client端的主要代码:         需要引用命名空间:using System.IO.Pipes; Thread pipeThread = new Thread(n

jcx5083761的专栏 2万+

VINS-Fusion实战:从零搭建无人机视觉惯性导航系统(附ROS配置指南)

本文提供了一份详尽的VINS-Fusion实战指南,涵盖从硬件选型、传感器标定到ROS节点配置与参数调优的全过程。重点解析了如何将VINS-Fusion视觉惯性里程计系统与PX4飞控深度集成,并实现室外GPS融合,旨在帮助开发者从零搭建稳定、高精度的无人机视觉惯性导航系统。

lll78的博客 865

C++和C#进程间通过命名管道来通信(附源码)—上

C++和C#进程之间通过命名管道通信(上) “命名管道”是一种简单的进程间通信(IPC)机制。命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。用命名管道来设计应用程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如TCP/IP或IPX)的知识。因为命名管道利用了微软网络提供者(MSNP)重定向器,通过一个网络,在各

码熊之家 7748

VINS技术路线与代码详解

VINS技术路线 写在前面:本文整和自己的思路,希望对学习VINS或者VIO的同学有所帮助,如果你觉得文章写的对你的理解有一点帮助,可以推荐给周围的小伙伴们,当然,如果你有任何问题想要交流,欢迎随时探讨。话不多说,下面上正文。 VINS代码地址:https://github.com/HKUST-Aerial-Robotics/VINS-Mono 参考文档:1.VINS-Mono A R...

wangshuailpp的博客 7万+

LVGL嵌入式GUI工程化架构与多窗口实践

嵌入式GUI开发中,LVGL作为轻量级图形库,其核心价值在于高效渲染与事件驱动机制。理解LVGL的对象树模型、资源管理机制(如RAW图像、静态字体)和屏幕生命周期,是构建稳定界面的基础。结合FreeRTOS等实时操作系统,可实现低功耗、高响应的交互体验。典型应用场景包括智能电表、HMI人机界面、工业控制面板等对内存敏感、需长期运行的设备。本文以微信式多窗口架构为范例,深入解析LVGL工程化落地的关键路径:分层目录结构、窗口模块封装、状态机式登录逻辑、TabView多页导航及图表/仪表盘动态可视化,覆盖从资源

weixin_36001279的博客 88

C#命名管道通信

C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI、发消息等。但在Windows下面发消息需要有窗口,我们的程序是一个后台运行程序,发消息不试用。RMI又用的太多了,准备用管道通信来做消息通信。 管道通信以前在大学学过,包括匿名管道和命名管道。匿名管道只能用在父子进程之间;命名管道可以用在两个进程甚至跨服务器通信。这里给出命名管道的示例。 服务器端代码 pr...

239

智能体异常行为检测-基于行为序列的异常模式识别技术【附代码】

在多智能体系统(Multi-Agent Systems, MAS)中,智能体之间的行为协调与自主决策是系统稳定运行的关键。然而,当某个智能体因策略偏移、环境变化或潜在攻击而出现**异常行为(Abnormal Behavior)**时,整个系统可能陷入混乱或崩溃。

一键难忘的博客 1144

C++和C#进程之间通过命名管道通信(上)

C++和C#进程之间通过命名管道通信(上) “命名管道”是一种简单的进程间通信(IPC)机制。命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。用命名管道来设计应用程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如TCP/IP或IPX)的知识。因为命名管道利用了微软网络提供者(MSNP)重定向器,通过一个网络,在各进程间建立通信。这样一来,应用程序便不必关心网络协议的细节。 命令管道是围绕Windows文件系统设计的一种机.

GJ_007的博客 930

SAP-MM-供应商对账平台(功能集合)

(1)集成OA审批,线上核销,结果写入SAP; (2)集成SRM,线上与供应商对账确认,写入SAP; (3)集成财务付款结果确认写入,OA回传结果,定时同步SRM供应商平台。 欢迎留言交流,功能完善,如需要页面设计,请订阅专栏

qq_32198063的博客 748

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++和C#进程之间通过命名管道通信(附源码)—下

C++和C#进程之间通过命名管道通信(附源码)—下 接上篇: 我采用的是C#开发的一个windows应用程序(pipe_server_csharp)作为服务器端,而MFC开发的应用程序(NamedPipeClient_vc)作为客户端。客户端和服务器端要进行频繁的大量的通信,常见的是文本信息和曲线数据,例如,一共有10条曲线,每条曲线有1000000条double数据。 服务器端: 服务器端是用在VS2005中用C#开发的一个名为pipe_server_csharp的应用程序,只有一个名为.

GJ_007的博客 976

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

匿名管道变得容易

在这个示例项目中,您将看到如何使使用AnonymousPipes类变得像我认为的那样简单和直观,并使用序列化在客户端和服务器应用程序之间传递数据。

寒冰屋的专栏 489

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C#命名隧道跨进程通信

在C#项目编写过程中,经常会遇到两个程序需要进行通信问题,如果两个程序在同一设备上运行,则可以选择命名隧道方式通信。本次写的是连续通信,在实际项目中,可能需要按业务需求自行封装。2.通信可靠,不易出现两个程序失联。2.多线程并发有数据丢失风险。1.通信过程需要自处理。

weixin_44599955的博客 379
上一篇: C++ 进程通信 管道
下一篇: C# Win32消息系列--WM
大地缸
博客等级 码龄16年 8粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值