dot net core 使用 IPC 進程通信

原文:dot net core 使用 IPC 進程通信

版權聲明:博客已遷移到 http://lindexi.gitee.io 歡迎訪問。如果當前博客圖片看不到,請到 http://lindexi.gitee.io 訪問博客。本文地址 https://blog.csdn.net/lindexi_gd/article/details/79946496

dot net core 使用 IPC 進程通信

本文告訴大家如何使用dot net core 和其他進程進行通信。

文章目錄

  • dot net core 使用 IPC 進程通信
    • 原理
    • 例子
    • 序列化

一般都是使用 WCF 或 remoting 做遠程通信,但是 dot net core 不支持 WCF 所以暫時我就只能使用 管道通信。

原理

管道通信使用的是 Pipe 需要啟動一對服務器和客戶端才可以使用。在 NamedPipeServerStream 啟動之后可以接受其他 NamedPipeClientStream 連接。

因為現在已經使用了 await 了,所以建議全部都可以寫異步,古老的程序員喜歡使用回調,但是現在的程序員還是建議使用 await 比較好,因為比較容易用。

創建的 NamedPipeServerStream 需要告訴管道的命名,和通信方式,通信可以分為單向和雙向,大家使用枚舉去看一下就可以知道。我來創建一個管道名是lindexi,可以雙向通信的管道。

            var pipe = new NamedPipeServerStream("lindexi", PipeDirection.InOut);

上面代碼就創建了一個管道,之后需要等待有連接才可以發送數據。

            await pipe.WaitForConnectionAsync();

等待了連接之后,就可以發送數據,發生的數據使用的是字節發送,所以需要轉換編碼。

            string str = "發送消息";var spxnfSrxldhhv = Encoding.UTF8.GetBytes(str);pipe.Write(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);

注意,需要指定發送數據的長度和數據,通過這個方法發送是不建議的。

如果需要使用一個比較高級的方法傳輸,請看文章最后

這時另一個程序就需要下面代碼連接

            var pipe = new NamedPipeClientStream(".", "lindexi", PipeDirection.InOut, PipeOptions.None);pipe.Connect()

上面代碼使用的 NamedPipeClientStream 需要指定管道的命名才可以找到。

連接之后可以通過這個方式讀取數據

            var spxnfSrxldhhv = new byte[65535];var n = pipe.Read(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);var str = Encoding.UTF8.GetString(spxnfSrxldhhv, 0, n);

對于讀寫數據很多時候就使用 pipe 的讀寫,寫入字節,讀出字節。

因為一次讀取可能會卡很多時間,所以建議使用異步讀。

如果覺得每次發送都需要轉 byte 然后進行寫,代碼很多,可以使用下面的代碼

            var stream = new StreamWriter(pipe);stream.Write("發送消息");stream.Flush();

注意不要使用下面的代碼

            using (var stream = new StreamWriter(pipe)){stream.Write("發送消息");}

原因是 using 會關閉 pipe 所以使用之后就不能在寫。

例子

首先創建兩個程序,一個是 WPF 程序 DgvlzKixtdin ,另一個是 dot net core 控制臺 HclkvyDanuiag 。接著需要從 DgvlzKixtdin 發送數據,從 HclkvyDanuiag 接收數據。

在 WPF 程序添加一個 TextBlock 和 Button ,點擊 Button 就發送消息到 dot net core 程序。收到消息就在 TextBlock 顯示。

在 Button 點擊的代碼寫下面代碼

      private async void HixKkikjgp_OnClick(object sender, RoutedEventArgs e){var pipe = new NamedPipeServerStream("lindexi", PipeDirection.InOut);await pipe.WaitForConnectionAsync();string str = "發送消息";var spxnfSrxldhhv = Encoding.UTF8.GetBytes(str);pipe.Write(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);spxnfSrxldhhv = new byte[100];var n = pipe.Read(spxnfSrxldhhv, 0, 100);str = Encoding.UTF8.GetString(spxnfSrxldhhv, 0, n);TjdsguhmKzj.Text = str;}

然后在 dot net core 程序寫下面代碼

        static void Main(string[] args){Console.WriteLine("Hello World!");var pipe = new NamedPipeClientStream(".", "lindexi", PipeDirection.InOut, PipeOptions.None);pipe.Connect();var spxnfSrxldhhv = new byte[65535];var n = pipe.Read(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);var str = Encoding.UTF8.GetString(spxnfSrxldhhv, 0, n);Console.WriteLine(str);str = "收到";spxnfSrxldhhv = Encoding.UTF8.GetBytes(str);pipe.Write(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);Console.Read();}

先啟動 WPF 程序,然后啟動控制臺

在這里插入圖片描述

這時點擊按鈕之后就打開控制臺可以看到控制臺可以收到消息

在這里插入圖片描述

然后 WPF 也收到控制臺發過來的消息

在這里插入圖片描述

序列化

雖然使用StreamWriter可以減少寫入讀取的代碼,但是實際上這樣只能用來傳字符串,需要把類傳輸還是比較難,所以我找到了 Protobuf ,使用這個庫可以簡單使用。

首先打開 Nuget 安裝 Protobuf 第一個

我這里使用 protobuf-net

然后創建一個類用來傳輸

    [ProtoContract]public class TyfxxTlkbjn{public string DczSwdsun { get; set; }}

使用下面代碼可以進行寫入

Serializer.Serialize(pipe, 實例);

所以修改一下上面的按鈕按下

        {var pipe = new NamedPipeServerStream("lindexi", PipeDirection.InOut);await pipe.WaitForConnectionAsync();var tyfxxTlkbjn = new TyfxxTlkbjn(){DczSwdsun = "發送消息"};Serializer.Serialize(pipe, tyfxxTlkbjn);pipe.Disconnect();

修改 dot net core的代碼

        static void Main(string[] args){var pipe = new NamedPipeClientStream(".", "lindexi", PipeDirection.InOut, PipeOptions.None);pipe.Connect();var tyfxxTlkbjn = Serializer.Deserialize<TyfxxTlkbjn>(pipe);Console.WriteLine(tyfxxTlkbjn.DczSwdsun);Console.Read();}

如果使用 wcf 請看 .NET Core調用WCF的最佳實踐

如果需要使用 grpc 請看.net core grpc 實現通信

我搭建了自己的博客 https://lindexi.gitee.io/ 歡迎大家訪問,里面有很多新的博客。只有在我看到博客寫成熟之后才會放在csdn或博客園,但是一旦發布了就不再更新

如果在博客看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業技術學院 歡迎大家加入

知識共享許可協議
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改后的作品務必以相同的許可發布。如有任何疑問,請與我聯系。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537270.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python可變類型和不可變深淺拷貝類型_python3筆記十四:python可變與不可變數據類型+深淺拷貝...

一&#xff1a;學習內容python3中六種數據類型python賦值python淺拷貝python深拷貝二&#xff1a;python3六種數據類型1.六種數據類型Number(數字)string(字符串)List(列表)Tuple(元祖)Set(集合)Dictionary(字典)2.六種數據類型分類不可變數據(3個)&#xff1a;Number、String、…

Android手機用wifi連接adb調試的方法

https://www.jianshu.com/p/dc6898380e38 0x0 前言 Android開發肯定要連接pc的adb進行調試&#xff0c;傳統的方法是用usb與pc進行連接&#xff0c;操作簡單即插即用&#xff0c;缺點是pc上必須得有對應手機的usb驅動程序&#xff0c;對于谷歌親兒子系列和三星摩托等外國品牌而…

控制臺應用程序換換為窗體應用_Epic為開發者設計了一套iPhone使用的運動捕捉應用程序...

玩懂手機網7月13日資訊&#xff0c;我們都知道對于游戲或者是動漫開發者來說&#xff0c;運動捕捉設備是一套非常昂貴的設備&#xff0c;需要非常專業的獨立開發人員&#xff0c;大量的時間才能完成&#xff0c;最近Epic為開發者設計了一套iPhone使用的運動捕捉應用程序。這套i…

螞蟻金服億級并發下的移動端到端網絡接入架構解析

為了與金融從業者、科技從業者共同探討金融 業務的深層次問題&#xff0c;螞蟻金服聯手 TGO 鯤鵬會上海分會&#xff0c;在 12 月 8 日舉辦了「走進螞蟻金服&#xff1a;雙十一背后的螞蟻金服技術支持」活動。螞蟻金服高級技術專家賈島為大家分享了《億級并發下的螞蟻移動端到…

python3.12答案_編程常見問題

通常&#xff0c;不要使用 from modulename import * 。這樣做會使導入器的命名空間變得混亂&#xff0c;并且使得連接器更難以檢測未定義的名稱。在文件的頂部導入模塊。這樣做可以清楚地了解代碼所需的其他模塊&#xff0c;并避免了模塊名稱是否在范圍內的問題。每行導入一個…

如何根據視頻的寬屏與豎屏來排序?

原理 寬屏與豎屏是根據 幀高度 與 幀寬度 來區分的 幀高度就是圖片高度&#xff08;縱向的像素尺寸&#xff09;&#xff0c;幀寬度就是圖片寬度&#xff08;橫向的像素尺寸&#xff09;&#xff0c;分辨率就是&#xff08;高度x寬度&#xff09;。 windows11的文件排序&…

HashiCorp Vault 1.0開源自動解封特性,新增Batch令牌

HashiCorp發布了其秘密管理工具Vault 的1.0版本&#xff0c;并開源了在發生故障或重啟后繼續使用Vault服務器所需的“自動解封&#xff08;auto-unseal&#xff09;”特性。這個版本提供了一種可以用于臨時工作負載的新令牌batch。另一個新特性是&#xff0c;Kubernetes auth現…

sap模塊介紹_小邁說|SAP究竟有多少模塊?

SAP究竟有哪些模塊繼上一期小邁說SAP&#xff01;SPA&#xff1f;的區別&#xff0c;相信大部分讀者明白了我們與水浴按摩行業的分別&#xff0c;可是僅僅區分名字還不夠&#xff0c;SAP還有眾多的模塊&#xff0c;這些又該怎么去了解呢&#xff1f;這就輪到肩負愛與責任的小邁…

360 再次開源管理平臺 Wayne:基于企業級 Kubernetes 集群

2019獨角獸企業重金招聘Python工程師標準>>> 奇虎 360 宣布正式開源 Wayne &#xff0c;這是一個由 360 搜索云平臺團隊開發的通用的、基于 Web 的 Kubernetes 多集群一站式可視化管理平臺。內置了豐富多樣的功能&#xff0c;滿足企業的通用需求&#xff0c;同時插件…

python setup.py install 出錯_python setup.py install 失敗

python setup&period;py install 報錯ImportError&colon; No module named setuptools學習光榮之路python課程時,使用python setup.py install安裝其他模塊時,第一次安裝某模塊成功了.安裝另一模塊卻報錯ImportError: No module named s ...對于python setup&perio…

Node.js 根本沒有這樣搞性能優化的?

1、使用最新版本的 Node.js 僅僅是簡單的升級 Node.js 版本就可以輕松地獲得性能提升&#xff0c;因為幾乎任何新版本的 Node.js 都會比老版本性能更好&#xff0c;為什么&#xff1f; Node.js 每個版本的性能提升主要來自于兩個方面&#xff1a; V8 的版本更新&#xff1b;Nod…

可交付成果、核實的可交付成果、驗收的可交付成果?

①可交付成果。指的是在某一過程、階段或項目完成時&#xff0c;產出的任何獨特并可核實的產品、成果或服務。可交付成果可能是有形的&#xff0c;也可能是無形的。【研發完成】 ②核實的可交付成果。是指已經完成&#xff0c;并經過“控制質量”過程檢查為正確的可交付成果。…

安裝oracle到create inventory時卡住了怎么辦_win10系統安裝教程(官方工具)

Hi&#xff0c;大家好。對于小白用戶&#xff0c;裝系統是比較頭疼的事&#xff0c;所以今天寫一個簡單易懂的裝系統教程。使用微軟官方提供的工具制作U盤啟動盤&#xff0c;操作簡單&#xff0c;系統純凈&#xff0c;強烈建議小白用戶使用。缺點是該工具功能單一&#xff0c;并…

Microsoft Project 排計劃的步驟

Microsoft Project 排計劃的步驟&#xff1a; 第一步&#xff1a;設置項目信息&#xff0c;開始日期&#xff0c;選擇日歷&#xff1b; 第二步&#xff1a;編制WBS 第三步&#xff1a;設置前置任務 第四步&#xff1a;設置WBS每個工期 第五步&#xff1a;設置資源名稱&#xff…

自建CDN Xnign產品指標

Xnign-X1 Xnign-X1 性能參數參考值L7 HTTP RPS &#xff08;128并發請求&#xff09;250W QPSL7 HTTP CPS &#xff08;128并發請求&#xff09;110W QPSL7 HTTP RPS &#xff08;100W并發請求&#xff09;180W QPSL7 HTTP CPS &#xff08;100W并發請求&#xff09;60W QPSL7 …

python表達式的值是 y 和n是什么意思_python中^是什么意思

展開全部在Python" // "表示整數除法。Python其它表達式e69da5e887aa3231313335323631343130323136353331333431353432&#xff1a;Python的表達式寫法與C/C類似。只是在某些寫法有所差別。主要的算術運算符與C/C類似。, -, *, /, //, **, ~, %分別表示加法或者取正、…

Linux的啟動流程簡析(以Debian為例)

Linux的啟動流程簡析(以Debian為例) 正文&#xff1a;前面的文章探討BIOS和主引導記錄的作用。那篇文章不涉及操作系統&#xff0c;只與主板的板載程序有關。今天&#xff0c;我想接著往下寫&#xff0c;探討操作系統接管硬件以后發生的事情&#xff0c;也就是操作系統的啟動流…

一階電路中的時間常數_精確移相電路的設計舉例

移相電路就是對輸入信號(一般是正弦波)進行相位控制&#xff0c;而不改變其幅度&#xff0c;本推文以移相電路為例&#xff0c;展示模擬電路的反饋設計技巧與方法&#xff1a;一、全通濾波器實現移相以上是兩種移相電路 的原理&#xff0c;其輸出幅度保持不變&#xff0c;移動的…

工作績效數據、工作績效信息、工作績效報告

目錄 概念 舉例 概念 工作績效數據&#xff1a;觀察&#xff0c;測量&#xff0c;采集到的原始數據 工作績效信息&#xff1a;對“工作績效數據”進行加工分析 工作績效報告&#xff1a;對“工作績效信息”進行白話 舉例 以去健身房為例 1&#xff09;工作績效數據&…