【C#】解析C#中管道流的使用
目录结构:
管道为进程间通信提供了一种可能。管道分为两种,一种是匿名管道,另一种是命名管道。
1.匿名管道(anonymous pipe)
匿名管道,匿名管道只提供在本地电脑进程间的通信。匿名管道比命名管道花费的开销更少,但提供的服务也比命名管道的少。匿名管道是单向的,而且不能用于网络通信。匿名管道只支持单服务器实例。
匿名管道不支持消息传输模式(PipeTransmissionMode.Message),仅支持字节传输模式(PipeTransmissionMode.Byte)。
创建匿名管道需要使用AnonymousPipeClientStream和AnonymousPipeServerStream类,下面的案例展示了匿名的管道的用法。
首先创建一个PipeServer.cs文件,其内容如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace PipeServer
{
class Program
{
static void Main(string[] args)
{
Process pipeClient1=new Process();
pipeClient1.StartInfo.FileName = @"PipeClient.exe"; //AnonymousPipeServerStream is an one-way pipe. in other words it's only support PipeDirection.In or PipeDirection.Out.
//in this program, we use PipeDirection.Out for send data to clients.
using (AnonymousPipeServerStream pipeServer =
new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable)) { //send the client handle that from AnonymousPipeServerStream to client
pipeClient1.StartInfo.Arguments = pipeServer.GetClientHandleAsString();
pipeClient1.StartInfo.UseShellExecute = false;
pipeClient1.Start(); //closes the local copy of the AnonymousPipeClientStream object's handle
//this method must be call after the client handle has been passed to the client
//if this method isn't called, then the AnonymousPipeServerStream will not receive notice when client dispose of it's PipeStream object
pipeServer.DisposeLocalCopyOfClientHandle(); try
{
using(StreamWriter sw=new StreamWriter(pipeServer)){
//automatic flush
sw.AutoFlush = true; sw.WriteLine("SYNC");
//it'll block util the other end of pipe has been read all send bytes
pipeServer.WaitForPipeDrain(); String temp=null;
while(true){
temp=Console.ReadLine();
//send message to pipeclient from console
sw.WriteLine(temp);
//it'll block util the other end of pipe has been read all send bytes
pipeServer.WaitForPipeDrain();
if(temp=="exit"){
break;
}
}
}
}
catch (IOException e) {
Console.WriteLine("[server] exception:{0}",e.Message);
}
} pipeClient1.WaitForExit();
pipeClient1.Close(); }
}
}
PipeServer.cs
然后创建PipeClient.cs文件,内容如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading.Tasks; class Program
{
static void Main(string[] args)
{ using (PipeStream pipeClient = new AnonymousPipeClientStream(PipeDirection.In, args[])) { using (StreamReader sr = new StreamReader(pipeClient)) {
String temp = null;
Console.WriteLine("[client] wait for sync ...");
do{
temp = sr.ReadLine();
}while(!temp.StartsWith("SYNC"));
Console.WriteLine("client in");
while ((temp = sr.ReadLine()) != null)
{
Console.WriteLine("[client] receive message: " + temp);
if(temp=="exit"){
break;
}
}
}
Console.Write("[client] Press Enter to exist...");
Console.ReadLine();
}
}
}
PipeClient.cs
这里只展示一个服务端一个客户端,但实际中可以有多个客户端。PipeClient.cs和PipeServer.cs应该在同一个文件夹下面,具体的路径由PipeServer.cs中加载客户端的路径决定,本例中是在同一路径下。然后可以使用csc将其都编译为可执行文件。
2.命名管道(named pipe)
命名管道和匿名管道的功能相似,但他们有如下两点区别:
- 命名管道既可以支持直接传输模式(PipeTransmissionMode.Byte),也可以支持消息传输模式(PipeTransmissionMode.Message)
- 命名管道既可以用于本地进程间的通信,也可以用于网络通信。
创建命名管道需要使用NamedPipeServerStream和NamedPipeClientStream类,下面的案例展示了命名管道的用法:
PipeServer.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace PipeServer
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Waiting client to connect...\n"); using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut))
{ //wait client to connect
pipeServer.WaitForConnection(); Console.WriteLine("[server] a client connected"); StreamReader reader = new StreamReader(pipeServer);
StreamWriter writer = new StreamWriter(pipeServer);
writer.AutoFlush = true; String line = null;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine("[server] receive message:"+line); writer.WriteLine("I'm fine"); pipeServer.WaitForPipeDrain(); if ("line" == "EXIT")
{
break;
}
}
}; Console.ReadLine();
}
}
}
PipeServer.cs
PipeClient.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace PipeClient
{
class Program
{
static void Main(string[] args)
{
//initialize NamePipeClientStream with serverName,pipeName,pipeDirection
using (NamedPipeClientStream pipeClient =
new NamedPipeClientStream("host path", "testpipe", PipeDirection.InOut)) { Console.WriteLine("[client] Attemping to connect to pipe...");
pipeClient.Connect(); Console.WriteLine("[client] connected to pipe");
Console.WriteLine("[client] There are currently {0} pipe server instances open.",pipeClient.NumberOfServerInstances); StreamWriter writer = new StreamWriter(pipeClient);
writer.AutoFlush = true;
StreamReader reader = new StreamReader(pipeClient); String temp = "";
while (true) {
temp = Console.ReadLine(); //send to server
writer.WriteLine(temp); pipeClient.WaitForPipeDrain(); //read from server
Console.WriteLine("[client] read message from server:"+reader.ReadLine()); if (temp == "EXIT") {
break;
}
}
} Console.ReadLine();
}
}
}
PipeClient.cs
这里需要注意,"."代表本机地址。如果需要到其他服务器,替换就好了。
【C#】解析C#中管道流的使用的更多相关文章
- linux命令中"|"管道流的意思
在linux中.可以利用符号:"|"来实现管道功能. 那么什么是管道功能呢: 管道是Shell的一大特征.他将多个命令前后连接起来形成一个管道流. 管道流中的每一个命令都作为一个单 ...
- Java基础IO类之字符串流(查字符串中的单词数量)与管道流
一.字符串流 定义:字符串流(StringReader),以一个字符为数据源,来构造一个字符流. 作用:在Web开发中,我们经常要从服务器上获取数据,数据返回的格式通常一个字符串(XML.JSON), ...
- Java中的管道流 PipedOutputStream和PipedInputStream
我们在学习IO流的时候可能会学字节流.字符流等,但是关于管道流的相信大部分视频或者教程都是一语带过,第一个是因为这个东西在实际开发中用的也不是很多,但是学习无止境,存在既有理.JDK中既然有个类那说明 ...
- node.js 从文件流中读写数据及管道流
读取数据 // 引入 fs 模块 const fs = require('fs'); // 创建可读流 let readStream = fs.createReadStream('index.txt' ...
- MVC5-2 MVC的管道流与路由
自定义Modue与Hander 之前讲了管道流中的Module与Hndler.现在我们可以去自定义Module和Handler Module 其实很简单,一共需要三个步骤 定义一个类去继承IHttpM ...
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...
- JAVA中管道通讯(线程间通讯)例子
Java I/O系统是建立在数据流概念之上的,而在UNIX/Linux中有一个类似的概念,就是管道,它具有将一个程序的输出当作另一个程序的输入的能力.在Java中,可以使用管道流进行线程之间的通信,输 ...
- Java IO7:管道流、对象流
前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...
- [Node.js] Node.js中的流
原文地址:http://www.moye.me/2015/03/29/streaming_in_node/ 什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现 ...
随机推荐
- android studio打可执行jar包
android studio可以通过library工程打出jar包 解压会看到META-INF/MANIFEST.MF文件的打开如下: Manifest-Version: 1.0 增加一行,注意冒号后 ...
- POJ 3281 Dining (拆点)【最大流】
<题目链接> 题目大意: 有N头牛,F种食物,D种饮料,每一头牛都有自己喜欢的食物和饮料,且每一种食物和饮料都只有一份,让你分配这些食物和饮料,问最多能使多少头牛同时获得自己喜欢的食物和饮 ...
- POJ-1679 The Unique MST (判断最小生成树的唯一性)
<题目链接> 题目大意: 给定一张无向图,判断其最小生成树是否唯一. 解题分析: 对图中每条边,扫描其它边,如果存在相同权值的边,则标记该边:用kruskal求出MST. 如果MST中无标 ...
- Codeforces 998D. Roman Digits 【打表找规律】
<题目链接> 题目大意: 现在有无限个 1,5,10,50这四个数字,从中恰好挑选n个数字,问你这些数字的和总共有多少种不同的情况. 解题分析: 由于此题 n 的范围特别大,达到了1e9, ...
- 004.NTP多层级架设
一 环境需求 1.1 需求 User-client:局域网所有节点主机: IN-NTP Server:隐藏于局域网内部的NTP服务器: Border-NTP:边界NTP服务器,用于同步外部时钟,同时对 ...
- python数据结构之栈
栈 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语: ...
- ORM(一)
1.什么是ORM ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去 ...
- SpringBoot整合dubbo
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成. 以上介绍来源于百度百科,具体dubbo相关可以自行查 ...
- Eclipse更新慢、插件安装慢解决方案zz
步骤 Eclipse -> Help -> Install New Software... 在出现的窗口点击Available Software Sites链接 将所有URL中的" ...
- 洛谷.3369.[模板]普通平衡树(Splay)
题目链接 第一次写(2017.11.7): #include<cstdio> #include<cctype> using namespace std; const int N ...