//管道服务类
public class PipServer
{
[DllImport("kernel32.dll", SetLastError = true)] public static extern SafeFileHandle CreateNamedPipe( String pipeName, //管道名 uint dwOpenMode,//管道类型 uint dwPipeMode,//管道参数 uint nMaxInstances,//管道能创建的最大实例数量 uint nOutBufferSize, //输出缓冲区长度 0表示默认 uint nInBufferSize,//输入缓冲区长度 0表示默认 uint nDefaultTimeOut,//超时时间 IntPtr lpSecurityAttributes);//指定一个SECURITY_ATTRIBUTES结构,或者传递零值 [DllImport("kernel32.dll", SetLastError = true)] public static extern int ConnectNamedPipe( SafeFileHandle hNamedPipe, IntPtr lpOverlapped); public const uint DUPLEX = (0x00000003); public const uint FILE_FLAG_OVERLAPPED = (0x40000000); public class Client
{
public SafeFileHandle handle; public FileStream stream;
} public delegate void RecivedMessageDelegate(string message); public delegate void MessageReceivedHandler(Client client, string message); public event MessageReceivedHandler MessageReceived; public const int BUFFER_SIZE = ; string pipeName; Thread listenThread; bool running; List<Client> clients; public string PipeName
{
get { return this.pipeName; } set { this.pipeName = value; }
} public bool Running
{
get { return this.running; }
} public PipServer()
{
this.clients = new List<Client>();
} public void Start()
{
this.listenThread = new Thread(new ThreadStart(ListenForClients)); this.listenThread.Start(); this.running = true;
} private void ListenForClients()
{
while (true)
{
SafeFileHandle clientHandle = CreateNamedPipe(
this.pipeName, DUPLEX | FILE_FLAG_OVERLAPPED, , , BUFFER_SIZE, BUFFER_SIZE, , IntPtr.Zero); if (clientHandle.IsInvalid) return; int success = ConnectNamedPipe(clientHandle, IntPtr.Zero); if (success == ) return; Client client = new Client(); client.handle = clientHandle; lock (clients) this.clients.Add(client); Thread readThread = new Thread(new ParameterizedThreadStart(Read)); readThread.Start(client);
}
} private void Read(object clientObj)
{
Client client = (Client)clientObj; client.stream = new FileStream(client.handle, FileAccess.ReadWrite, BUFFER_SIZE, true); byte[] buffer = new byte[BUFFER_SIZE]; //ASCIIEncoding encoder = new ASCIIEncoding(); UTF8Encoding encoder = new UTF8Encoding();//可以传汉字 while (true)
{
int bytesRead = ; try
{
bytesRead = client.stream.Read(buffer, , BUFFER_SIZE);
}
catch
{
break;
} if (bytesRead == ) break; if (this.MessageReceived != null) this.MessageReceived(client, encoder.GetString(buffer, , bytesRead));
}
client.stream.Close(); client.handle.Close(); lock (this.clients) this.clients.Remove(client);
} public void SendMessage(string message)
{
lock (this.clients)
{
ASCIIEncoding encoder = new ASCIIEncoding(); byte[] messageBuffer = encoder.GetBytes(message); foreach (Client client in this.clients)
{
client.stream.Write(messageBuffer, , messageBuffer.Length); client.stream.Flush();
}
}
}
}
//启动管道服务
public partial class Form_PipServer : Form
{
public Form_PipServer()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
ServerPort serverPort;
try
{
serverPort = new ServerPort(this, new PipServer.RecivedMessageDelegate(DisplayMessage)); serverPort.pipeServer = new PipServer(); serverPort.PipServerStart(); }
catch
{ } } void DisplayMessage(string message)
{
textBox1.Text += message + "\r\n";
} public class ServerPort
{ private Delegate sendMessage = null; private ContainerControl mainForm; public PipServer pipeServer = null; public ServerPort(ContainerControl form, Delegate sendmessage)
{
mainForm = form; sendMessage = sendmessage;
} void SendMsg(string msg)
{
this.mainForm.Invoke(sendMessage, new Object[] { msg });
} void PipeServer_MessageReceived(PipServer.Client client, string message)
{
if (!message.Equals(""))
{
SendMsg("接收到的信息是:" + message);
}
else
{
SendMsg("消息未收到???");
}
} public void MessageSend()
{ } public void PipServerStart()
{
try
{
if (!this.pipeServer.Running)
{
this.pipeServer.PipeName = "\\\\.\\Pipe\\piperulecfg";//管道名称 this.pipeServer.Start(); this.pipeServer.MessageReceived += new PipServer.MessageReceivedHandler(PipeServer_MessageReceived);
}
}
catch
{
}
}
}
}
//客户端类 

public class PipClient
{
[DllImport("kernel32.dll", SetLastError = true)] public static extern SafeFileHandle CreateFile( String pipeName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplate); public const uint GENERIC_READ = (0x80000000); public const uint GENERIC_WRITE = (0x40000000); public const uint OPEN_EXISTING = ; public const uint FILE_FLAG_OVERLAPPED = (0x40000000); public delegate void MessageReceivedHandler(string message); public event MessageReceivedHandler MessageReceived; public const int BUFFER_SIZE = ; string pipeName; private FileStream stream; private SafeFileHandle handle; Thread readThread; bool connected; public bool Connected
{
get { return this.connected; }
} public string PipeName
{
get { return this.pipeName; } set { this.pipeName = value; }
} public void Connect()
{
this.handle = CreateFile( //管道属于一种特殊的文件 this.pipeName, //创建的文件名 GENERIC_READ | GENERIC_WRITE, //文件模式 , //是否共享 IntPtr.Zero, //指向一个SECURITY_ATTRIBUTES结构的指针 OPEN_EXISTING,//创建参数 FILE_FLAG_OVERLAPPED,//文件属性(隐藏,只读)NORMAL为默认属性 IntPtr.Zero);//模板创建文件的句柄 if (this.handle.IsInvalid)
return; this.connected = true; this.stream = new FileStream(this.handle, FileAccess.ReadWrite, BUFFER_SIZE, true); this.readThread = new Thread(new ThreadStart(Read)); this.readThread.Start();
} public void Read()
{
byte[] readBuffer = new byte[BUFFER_SIZE]; ASCIIEncoding encoder = new ASCIIEncoding(); while (true)
{
int bytesRead = ; try
{
bytesRead = this.stream.Read(readBuffer, , BUFFER_SIZE);
}
catch
{
break;
} if (bytesRead == )
break; if (this.MessageReceived != null) this.MessageReceived(encoder.GetString(readBuffer, , bytesRead));
}
this.stream.Close(); this.handle.Close();
} public void SendMessage(string message)
{
//ASCIIEncoding encoder = new ASCIIEncoding(); UTF8Encoding encoder = new UTF8Encoding();//可以传汉字 byte[] messageBuffer = encoder.GetBytes(message); this.stream.Write(messageBuffer, , messageBuffer.Length); this.stream.Flush();
}
}
//客户端发送消息到服务端
public partial class Form_PipClient : Form
{
public Form_PipClient()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
string szInfo = textBox1.Text;
ClientPort.MessagePipeStart(szInfo);
} public class ClientPort
{
private static PipClient pipeClient; public static void MessagePipeStart(string szInfo)
{
if (pipeClient == null)
{
pipeClient = new PipClient(); pipeClient.MessageReceived += new PipClient.MessageReceivedHandler(pipeClient_MessageReceived);
} if (!pipeClient.Connected)
{
pipeClient.PipeName = "\\\\.\\Pipe\\piperulecfg"; pipeClient.Connect();
} if (pipeClient != null && pipeClient.Connected)
{
MessageSend(szInfo);
}
else
{
MessageBox.Show("连接建立失败,请确保服务端程序已经被打开。");
}
} static void MessageSend(string str)
{
pipeClient.SendMessage(str);
}

//客户端接收消息
static void pipeClient_MessageReceived(string message)
{ }
}
}

 欢迎加群交流 QQ群 830426796

C# 管道通信 (client —— server)Framework2.0版本也可用的更多相关文章

  1. 运维监控-基于yum的方式部署Zabbix Server 4.0 版本

    运维监控-基于yum的方式部署Zabbix Server 4.0 版本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.如何选择zabbix版本 1>.打开zabbix官方 ...

  2. nginx1.14.0版本高可用——keepalived双机热备

    nginx不支持主从,所以我们需要使用keepalive支持高可用. keepalived重要知识点 在局域网内,每个主机上各安装一个keepalived,注意关闭防火墙firewalld,然后设定一 ...

  3. IIS6中给Framework2,。0站点的虚拟目录(2.0版本)下发布Web API项目(4.0版本)问题处理

    Web-API项目以虚拟目录形式部署到IIS6/IIS7 若原有站点为Framework2.0版本,在此站点(或虚拟目录站点)下,新增API虚拟目录,然后选择Framework4.0版本,IIS6和I ...

  4. MySQL Server8.0版本时出现Client does not support authentication protocol requested by server

    MySQL Server8.0版本时出现Client does not support authentication protocol requested  by server 解决方法: 1.roo ...

  5. Hadoop源码解析之 rpc通信 client到server通信

    rpc是Hadoop分布式底层通信的基础,无论是client和namenode,namenode和datanode,以及yarn新框架之间的通信模式等等都是采用的rpc方式. 下面我们来概要分析一下H ...

  6. 分析一个socket通信: server/client

    分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...

  7. MySQL 8.0版本连接报错:Could not create connection to database server.

    准备搭建一个Spring Boot 组合mybatis的项目,数据库采用的是MySQL 8.0.11按照以往的配置,使用插件mybatis-generator-maven-plugin生成代码时,一直 ...

  8. 基于yum的方式安装Cloudera Manager Server(使用Mysql 8.0版本)

    基于yum的方式安装Cloudera Manager Server(使用Mysql 8.0版本) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装和配置元数据库 1>. ...

  9. (C#2,.net framework2.0,Visual Studio 2003)之前版本

    (C#2,.net framework2.0,Visual Studio 2003)之前版本归为最初的版本(主要是针对.net framework),其主要定义了最基本的类型.特性. 1.基本的类型 ...

随机推荐

  1. java基础-类成员访问权限控制

    一 前言 这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心.本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制 ...

  2. 什么是Java优先级队列?

    PriorityQueue是基于无界优先级队列和优先级堆构建的重要Java API之一.本文通过适当的代码示例深入了解了有关此API及其用法的一些复杂信息.另在上篇文章中我们简单地谈了下Java编译器 ...

  3. 关于ConfigurationSection自定义config的简单使用

    1.1.自定义config结构(参考对应颜色标注),放到configuration根节点下: <test> <testInfos> <" /> <& ...

  4. 65-如何部署 Calico 网络?

    Calico 是一个纯三层的虚拟网络方案,Calico 为每个容器分配一个 IP,每个 host 都是 router,把不同 host 的容器连接起来.与 VxLAN 不同的是,Calico 不对数据 ...

  5. Java面试必看之Integer.parseInt()与Integer.valueOf()

    Integer.parseInt()和Integer.valueOf()都是将成为String转换为Int,但是为什么Java会提供两个这样的方法呢,他们如果是同样的操作,岂不是多此一举? 我们来深挖 ...

  6. 在Linux 中搭建 Mysql

    在本次搭建,出现了各种问题,一直解决不掉,建议各位小伙伴不要像我一样,像一个无头的苍蝇一样,这有问题就解决这个问题,没有意识本质实在的问题. 主要问题(加星,标重点):一定要看自己的linux 版本, ...

  7. 牛客国庆训练 H.千万别用树套树

    链接https://ac.nowcoder.com/acm/contest/1108/H 国庆队内训练的题,当时还完全没思路,就没补.现在会树状数组了,倒是能想一想,不过网上题解好多用线段树传数组的? ...

  8. Vue之判断对象是否为空的方法

    1. JSON.stringify(xxx)=='{}' 2. Object.keys(xxx).length==0 验证结果如下:

  9. C# Newtonsoft.Json JsonSerializerSettings配置

    JsonSerializerSettings常用配置整理 1.忽略某些属性 MemberSerialization.OptIn 默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonPro ...

  10. Spring Boot 为什么这么火?

    没错 Spring Boot 越来越火了,而且火的超过了我的预期,作为一名行走一线的 Java 程序员,你可能在各个方面感受到了 Spring Boot 的火. Spring Boot 的火 技术社区 ...