C# 管道通信 (client —— server)Framework2.0版本也可用
//管道服务类
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版本也可用的更多相关文章
- 运维监控-基于yum的方式部署Zabbix Server 4.0 版本
运维监控-基于yum的方式部署Zabbix Server 4.0 版本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.如何选择zabbix版本 1>.打开zabbix官方 ...
- nginx1.14.0版本高可用——keepalived双机热备
nginx不支持主从,所以我们需要使用keepalive支持高可用. keepalived重要知识点 在局域网内,每个主机上各安装一个keepalived,注意关闭防火墙firewalld,然后设定一 ...
- IIS6中给Framework2,。0站点的虚拟目录(2.0版本)下发布Web API项目(4.0版本)问题处理
Web-API项目以虚拟目录形式部署到IIS6/IIS7 若原有站点为Framework2.0版本,在此站点(或虚拟目录站点)下,新增API虚拟目录,然后选择Framework4.0版本,IIS6和I ...
- 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 ...
- Hadoop源码解析之 rpc通信 client到server通信
rpc是Hadoop分布式底层通信的基础,无论是client和namenode,namenode和datanode,以及yarn新框架之间的通信模式等等都是采用的rpc方式. 下面我们来概要分析一下H ...
- 分析一个socket通信: server/client
分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...
- MySQL 8.0版本连接报错:Could not create connection to database server.
准备搭建一个Spring Boot 组合mybatis的项目,数据库采用的是MySQL 8.0.11按照以往的配置,使用插件mybatis-generator-maven-plugin生成代码时,一直 ...
- 基于yum的方式安装Cloudera Manager Server(使用Mysql 8.0版本)
基于yum的方式安装Cloudera Manager Server(使用Mysql 8.0版本) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装和配置元数据库 1>. ...
- (C#2,.net framework2.0,Visual Studio 2003)之前版本
(C#2,.net framework2.0,Visual Studio 2003)之前版本归为最初的版本(主要是针对.net framework),其主要定义了最基本的类型.特性. 1.基本的类型 ...
随机推荐
- VUEday01
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C# WPF实用的注册窗体
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...
- HttpRunner学习4--使用正则表达式提取数据
前言 在HttpRunner中,我们可通过extract提取数据,当响应结果为 JSON 结构,可使用 content 结合 . 运算符的方式,如 content.code,用起来十分方便,但如果响应 ...
- kafka2.3.1+zookeeper3.5.6+kafka-manager2.0.0.2集群部署(centos7.7)
一.准备三台服务器,配置好主机名和ip地址 二.服务器初始化:包括安装常用命令工具,修改系统时区,校对系统时间,关闭selinux,关闭firewalld,修改主机名,修改系统文件描述符,优化内核参数 ...
- JDK1.8新特性-Lambda表达式
Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表 ...
- sql server无法连接本地服务器
当连接sql server本地服务器 报一下错误: 标题: 连接到服务器 ------------------------------ 无法连接到 localhost. ---..... 打开wind ...
- Unity Ruby's Adventure 第二步
加载游戏资源(已注册Unity) Step1:打开Unity 依次点击 Window>Asset Store(资源商店) Step2:搜索资源 Ruby's Adventure Step3:购买 ...
- AWVS12破解版使用
本篇简单介绍AWVS12破解版的安装使用,如果您已经安装了AWVS 10.5的版本,不用卸载,可以共存. AWVS12破解版下载链接:https://github.com/starnightcyber ...
- SQLyog连接MySQL8.0报2058错误的解决方案
引言 用SQLyog连接MySQL8.0(社区版:mysql-installer-community-8.0.15.0.msi),出现错误2058(Plugin caching_sha2_passwo ...
- SQL实用技巧:如何判断一个值是否为数字的方法
检测是不是数字型的数据, 两种方法 1. ISNUMERIC ( expression ) 2. PATINDEX ( ‘%pattern%‘ , expression ) 1. ISNUMERIC ...