C# 命名管道管道NamedPipeServerStream使用

news2024/10/7 10:23:45

NamedPipeServerStream 是 .NET Framework 和 .NET Core 中提供的一个类,用于创建和操作命名管道的服务器端。命名管道是一种在同一台计算机上或不同计算机之间进行进程间通信的机制。

命名管道允许两个或多个进程通过共享的管道进行通信。其中一个进程充当服务器,创建管道并等待客户端连接。其他进程充当客户端,连接到服务器创建的管道,并通过管道进行数据交换。

NamedPipeServerStream 类提供了创建命名管道服务器端的功能。它允许你指定管道的名称、方向(输入、输出或双向)和一些其他选项。一旦服务器端创建并等待连接,客户端可以使用 NamedPipeClientStream 类连接到该管道,并进行数据交换。

本次只演示客户端-服务端通讯:

服务端: 

 

/// <summary>
    /// 服务端
    /// </summary>
    public partial class FrmTest : Form
    {
        private NamedPipeServerStream pipeServer;
        volatile bool _receive = true;
        public FrmTest()
        {
            InitializeComponent();

            // 连接到命名管道
            pipeServer = new NamedPipeServerStream("Test", PipeDirection.In);
            Thread thread = new Thread(() =>
            {
                while (_receive)
                {
                    try
                    {
                        if(!pipeServer.IsConnected)
                        {
                            Console.WriteLine("等待客户端连接。。。");
                            pipeServer.WaitForConnection();
                            Console.WriteLine("客户端已连接。。。");
                        }

                        // 读取字节大小
                        byte[] sizeBuffer = new byte[sizeof(int)];
                        pipeServer.Read(sizeBuffer, 0, sizeBuffer.Length);
                        int messageSize = BitConverter.ToInt32(sizeBuffer, 0);
                        // 消息内容
                        byte[] responseBytes = new byte[messageSize];
                        Console.WriteLine("等待客户端发送消息。。。");
                        int bytesRead = pipeServer.Read(responseBytes, 0, responseBytes.Length);
                        Console.WriteLine("客户端已发送消息。。。");
                        string response = Encoding.UTF8.GetString(responseBytes, 0, bytesRead);
                        this.ExecBeginInvoke(() =>
                        {
                            this.richTextBox1.AppendText(DateTime.Now.ToStringFromDateTime() + ":\r\n" + response + "\r\n");
                        });

                        pipeServer.Disconnect();
                    }
                    catch (Exception ex)
                    {
                        Trace.WriteLine(ex.Message+"\r\n"+ex.StackTrace);
                    }
                    finally
                    {
                    }
                }
            });
            thread.Start();
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
        }


        private void FrmTest_FormClosing(object sender, FormClosingEventArgs e)
        {
            _receive = false;
            if (pipeServer.IsConnected)
            {
                pipeServer.Disconnect();
            }
            // 关闭管道
            pipeServer.Close();
            this.Dispose();
            Application.ExitThread();
            Application.Exit();
            Process.GetCurrentProcess().Kill();
        }

        private void FrmTest_FormClosed(object sender, FormClosedEventArgs e)
        {
        }
    }

客户端: 

/// <summary>
    /// 客户端
    /// </summary>
    public partial class FrmTest : Form
    {
        public FrmTest()
        {
            InitializeComponent();

        }
       
        private void button1_Click(object sender, EventArgs e)
        {
            string msg = this.richTextBox1.Text;
            // 连接到命名管道服务器
            using (NamedPipeClientStream clientStream = new NamedPipeClientStream(".", "Test", PipeDirection.Out))
            {
                try
                {
                    Console.WriteLine("等待连接到服务器");
                    clientStream.Connect(5000);
                    Console.WriteLine("已连接到服务器");

                    // 向服务器发送消息
                    string message = msg;
                    byte[] messageBytes = Encoding.UTF8.GetBytes(message);
                    byte[] msgSize = Encoding.UTF8.GetBytes(messageBytes.Length.ToString());
                    clientStream.Write(msgSize, 0, msgSize.Length);
                    clientStream.Write(messageBytes, 0, messageBytes.Length);
                    Console.WriteLine("已发送消息至服务器");
                }
                catch(Exception ex)
                {
                    Console.WriteLine("连接超时。。。");
                }
                finally
                {
                    clientStream.Close();
                }
            }
        }
        private void FrmTest_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.Dispose();
            Application.ExitThread();
            Application.Exit();
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1411818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS网络配置进阶:深入研究network服务和NetworkManager

前言 如果你正在使用CentOS系统,并且想要深入了解网络管理和配置,那么本文肯定适合你!在这篇文章中,作者深入探讨了CentOS中的两种网络管理方式:network服务和NetworkManager。通过详实的讲解和实用的示例,你将会学习到如何使用这两种工具来管理网络接口、配置IP地址、网…

外贸邮件群发软件有哪些?邮件群发的系统?

外贸邮件群发软件哪个比较好&#xff1f;外贸开发信软件推荐&#xff1f; 对于许多外贸企业来说&#xff0c;邮件营销是一种非常有效的推广方式。那么&#xff0c;外贸邮件群发软件就成为了必备的工具。蜂邮EDM将为你揭秘几款主流的外贸邮件群发软件&#xff0c;助你更好地开展…

用javadoc生成springboot的文档

概述&#xff1a;生成 Spring Boot 项目的 JavaDoc 文档与生成普通的 Java 项目类似。 目录 第一步&#xff1a;创建一个springboot项目 第二步&#xff1a;编写pom文件 第三步&#xff1a;运行 Maven 命令生成 JavaDoc 第四步&#xff1a;查看结果 第一步&#xff1a;创建…

海外媒体发稿:出口贸易媒体发稿推广8种方法让您事半功倍-华媒舍

通过出口贸易媒体发稿可以帮助企业拓展市场、提升知名度&#xff0c;从而取得更好的出口贸易业绩。在进行媒体发稿时&#xff0c;需要确定目标受众&#xff0c;编写吸引人的标题&#xff0c;提供有价值的内容&#xff0c;并选择合适的媒体平台和发布时间。通过持续改进和优化&a…

自然语言NLP学习

2-7 门控循环单元&#xff08;GRU&#xff09;_哔哩哔哩_bilibili GRU LSTM 双向RNN CNN 卷积神经网络 输入层 转化为向量表示 dropout ppl 标量 在物理学和数学中&#xff0c;标量&#xff08;Scalar&#xff09;是一个只有大小、没有方向的量。它只用一个数值就可以完全…

docker之部署青龙面板

青龙面板是一个用于管理和监控 Linux 服务器的工具&#xff0c;具有定时运行脚本任务的功能。在实际情况下也可以用于一些定期自动签到等任务脚本的运行。 本次记录下简单的安装与使用&#xff0c;请提前安装好docker&#xff0c;参考之前的文章。 一、安装部署 1、拉取镜像 # …

小迪安全21WEB 攻防-JavaWeb 项目JWT 身份攻击组件安全访问控制

#知识点&#xff1a; 1、JavaWeb 常见安全及代码逻辑 2、目录遍历&身份验证&逻辑&JWT 3、访问控制&安全组件&越权&三方组件 Java&#xff1a;大部分都是第三方插件出现漏洞 webgoat的搭建&#xff1a;——java靶场 JDK版本要求&#xff1a;11.0…

图形绘制QGraphicsView、QGraphicsScene、QGraphicsItem、Qt GUI

QGraphicsView、QGraphicsScene、QGraphicsItem 和 Qt GUI&#xff08;QGuiApplication&#xff09;可以用来构建和管理基于图形的用户界面。 一、它们之间的关系&#xff1a; QGuiApplication 作为应用程序的基础&#xff0c;提供了窗口和事件管理等功能。 QGraphicsView 则…

15- OpenCV:模板匹配(cv::matchTemplate)

目录 1、模板匹配介绍 2、cv::matchTemplate 3、模板匹配的方法&#xff08;算法&#xff09; 4、代码演示 1、模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。 它可以在一幅图像中寻找与给定模板最相似的部分。 模板匹配的步骤&#xff1a; &a…

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备2

接前一篇文章&#xff1a;中移&#xff08;苏州&#xff09;软件技术有限公司面试问题与解答&#xff08;4&#xff09;—— virtio所创建的设备1 在上一篇文章中&#xff0c;对于面试所提出的问题“virtio会创建哪些设备&#xff1f;”&#xff0c;有了初步答案&#xff0c;即…

基于python和定向爬虫的商品比价系统实现

目录 前言 一、系统设计 1. 系统需求分析 2. 系统设计思路 二、系统实现 1. 爬虫部分 2. 比价部分 3. 完整系统代码 三、系统优化 1. 多线程爬取 2. 引入数据库 四、总结 前言 商品比价系统是一种可以帮助用户快速找到最优价格商品的系统。本文将介绍如何使用pyth…

开源的API Gateway项目- Kong基于OpenResty(Nginx + Lua模块)

Kong 是一个在 Nginx 内运行的开源 API 网关和微服务抽象层。它是用于处理 API 流量的灵活、可扩展、可插入的工具。 Kong 提供了以下功能&#xff1a; 用户登录&#xff1a;Kong 提供了多种认证插件&#xff0c;像 JWT、OAuth 2.0 等&#xff0c;可以满足用户登录需求。Toke…

Linux---文件系统

在基础IO中&#xff0c;我们所讲的都是对被打开文件的管理&#xff0c;但是不是所有的文件都是被打开的&#xff0c;对那些在磁盘中保存的没有被打开的文件&#xff0c;我们同样也需要管理&#xff0c;这个就像是快递站中等待被人取走的快递&#xff0c;我们需要将它们分门别类…

Java项目:15 springboot vue的智慧养老手表管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统共分为两个角色&#xff1a;家长&#xff0c;养老院管理员 框架&#xff1a;springboot、mybatis、vue 数据库&#xff1a;mysql 5.7&…

Fink CDC 1.0 至3.0的从古至今

本文主要分享Flink CDC 1.0 至3.0的发展历程,了解其背后的关键特性和发展趋势,探讨其在大数据领域的影响和价值。 一、CDC概述 CDC是一种用以掌控数据变化的软件架构(技术思路),用于捕获和传递数据库中发生的数据变化。当数据库中发生增(INSERT)/删(DELETE)/改(UPD…

#GPU|LLM|AIGC#集成显卡与独立显卡|显卡在深度学习中的选择与LLM GPU推荐

区别 核心区别&#xff1a;显存&#xff0c;也被称作帧缓存。独立显卡拥有独立显存&#xff0c;而集成显卡通常是没有的&#xff0c;需要占用部分主内存来达到缓存的目的 集成显卡&#xff1a; 是集成在主板上的&#xff0c;与主处理器共享系统内存。 一般会在很多轻便薄型的…

win11 C盘出现感叹号

Win11系统中&#xff0c;出现本地磁盘上出现黄色感叹号&#xff0c;是BitLocker未关闭或者正在激活导致 解决方案&#xff1a; 鼠标右键点击开始菜单 &#xff0c;之后选择“Windows终端”管理员 管理-bde状态&#xff1b;# #检查状态 管理-bde&#xff1f;# #查看帮助 Mana…

Docker 配置 Gitea + Drone 搭建 CI/CD 平台

Docker 配置 Gitea Drone 搭建 CI/CD 平台 配置 Gitea 服务器来管理项目版本 本文的IP地址是为了方便理解随便打的&#xff0c;不要乱点 首先使用 docker 搭建 Gitea 服务器&#xff0c;用于管理代码版本&#xff0c;数据库选择mysql Gitea 服务器的 docker-compose.yml 配…

Python如何让程序实现开机自启功能(随Windows启动)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现步骤 📒📝 方法一:使用Windows任务计划程序📝 方法二:添加注册表🎈 创建注册表项🎈 检查注册表项是否成功创建⚓️ 相关链接 ⚓️📖 介绍 📖 为了方便省事,我们很多时候需要给软件添加一个开机自启的功能,…

《微信小程序开发从入门到实战》学习九十三

7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示&#xff1a; indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时&#xff0c;可以使用HexColor&#xff0c;也可以使用r…