//管道服务类
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读写DBF文件

    1. 准备: Jar包下载:链接: https://pan.baidu.com/s/1Ikxx-vkw5vSDf9SBUQHBCw 提取码: 7h58 复制这段内容后打开百度网盘手机App,操作更方便 ...

  2. 《Java知识应用》Java压缩文件和解压缩

    今天通过Java实现一下:文件的压缩和解压缩. 1. 压缩 准备文件: 准备代码:(压缩) import java.io.BufferedInputStream; import java.io.Buf ...

  3. Flutter - You need to use a different version code for your APK or Android App Bundle because you already have one with version code 1.

    前两天提交了一个版本Google Play,结果今天收到拒绝的邮件,说App内购有问题. 于是把设置里面的支付宝和微信打赏功能关闭,又打了一个aab. 然后上传到Google Play,结果提示 Yo ...

  4. 创建基于ASP.NET core 3.1 的RazorPagesMovie项目(二)-应用模型类配合基架生成工具生成Razor页面

    本节中,将学习添加用于管理跨平台的SQLLite数据库中的电影的类Movie.从ASP.NET core 模板创建的应用使用SQLLite数据库. 应用模型类(Movie)配合Entity Frame ...

  5. Winform中实现自定义屏保效果(附代码下载)

    场景 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建form ...

  6. Linux.centos安装mysql5.7.18

    一:删除已有的mysql步骤 1 卸载旧的mysql 1.1 查询有哪些mysql文件 [root@zookeeper init.d]# find / -name mysql /var/lock/su ...

  7. Jmeter工具使用初体验

    一.Jmeter组成部分 一个完整的脚本必须包含以下三项,他们都在测试计划的子选项中,我们直接在测试计划上右键选择即可 线程组 取样器 监视器 二.脚本编写 1.创建线程组 2.添加取样器 我们这里添 ...

  8. TensorFlow实现图像卷积并可视化示例

    图片尺寸要自己修改. 看起来好像没啥意思,不知道下一步能干什么,先卷了再说.由于weights是随机生成的(tf.random_normal作用:用于从服从指定正太分布的数值中取出随机数),所以每次卷 ...

  9. Axure制作dialog效果的动作步骤

    1.在Axure中添加一个弹框按钮  2.将动态面版拖动到界面中    3.双击动态面版,双击state  4.拖入一块图片占位符进来    5.设置图片  6.回到上一个界面设置动态面版的大小,使其 ...

  10. 百度地图在jsp页面加载大量轨迹导致地图卡顿

    原画线方式: //存储大量点轨迹json数组:historyPathList for(var i=0;i<historyPathList.length-1;i++){ drawColorLine ...