C# NamedPipe管道的简单应用

用于同一台电脑两个进程之间数据交互

一、声明管道标识名serverName,服务器、客户端基于此创建

二、创建一个服务器 NamedPipeServerStream ,以此获取读取数据流(StreamReader)、写入数据流(StreamWriter);然后等待客户端连接 serverStream_m.WaitForConnection(); 客户端连接后,用读取数据流循环读取缓存数据ReadLine();

三、创建一个客户端 NamedPipeClientStream,以此获取读取数据流(StreamReader)、写入数据流(StreamWriter);然后客户端连接服务器Connect()

四、定义通讯协议,即接收指定数据做指定事情

五、服务器、客户端写入数据流(StreamWriter)写入数据后,一定要调用Flush()函数,把数据写入到缓存区

PS:在代码中打开另外一个进程

    Process[] processes = Process.GetProcessesByName("程序名称");
    foreach (Process process1 in processes)
    {
        process1.Kill();
    }
    Process process = Process.Start("程序名称.exe");


1、服务器代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.IO.Pipes;
using System.Threading;
 
namespace NamedPipeComm
{
    public class PipeServer
    {
        private NamedPipeServerStream serverStream_m = null;
        private StreamReader sReader_m;
        private StreamWriter sWriter_m;
        private object lock_m = new object();
        private IRCameraControl IRCamera_m;
 
        private const string TOTAL_TEMP = "TOTAL";
        private const string SINGLE_TEMP = "SINGLE";
        private const string IS_CONNECT = "CONNECT";
        private const string SHOW = "SHOW";
        private const string HIDE = "HIDE";
        private const string CLOSE = "CLOSE";
 
        public PipeServer(string serverName, IRCameraControl iRCamera)
        {
            serverStream_m = new NamedPipeServerStream(serverName);
 
            sReader_m = new StreamReader(serverStream_m);
            sWriter_m = new StreamWriter(serverStream_m);
 
            IRCamera_m = iRCamera;
            HandleDataReceived();
        }
        
        /// <summary>
        /// 处理客户端数据
        /// </summary>
        /// <param name="ar"></param>
        private void HandleDataReceived()
        {
            Task.Run(delegate
            {
                serverStream_m.WaitForConnection();
                do
                {
                    try
                    {
                        if (serverStream_m.IsConnected)
                        {
                            string[] data = sReader_m.ReadLine().Split(',');
 
                            switch (data[0])
                            {
                                case TOTAL_TEMP:
                                    float[] fInfo = IRCamera_m.GetTempInfoTotalROI();
                                    if (fInfo.Length == 3)
                                    {
                                        sWriter_m.WriteLine(string.Format("{0},{1},{2}", fInfo[0], fInfo[1], fInfo[2]));
                                        sWriter_m.Flush();
                                    }
                                    break;
                                case SINGLE_TEMP:
                                    try
                                    {
                                        int count = Convert.ToInt32(data[1]);
                                        float[] fInfo1 = IRCamera_m.GetTempInfoROI(count);
                                        if (fInfo1.Length == 3)
                                        {
                                            sWriter_m.WriteLine(string.Format("{0},{1},{2}", fInfo1[0], fInfo1[1], fInfo1[2]));
                                            sWriter_m.Flush();
                                        }
                                    }
                                    catch (Exception ex)
                                    {
 
                                    }
                                    break;
                                case IS_CONNECT:
                                    if (IRCamera_m.IsConnect)
                                    {
                                        sWriter_m.WriteLine(IS_CONNECT);
                                        sWriter_m.Flush();
                                    }
                                    break;
                                case SHOW:
                                    IRCamera_m.ShowForm();
                                    break;
                                case CLOSE:
                                    if (IRCamera_m.frmIRAY_m != null)
                                    {
                                        IRCamera_m.frmIRAY_m.Close();
                                    }
                                    else
                                    {
                                        IRCamera_m.ReleaseSDK();
                                    }
                                    break;
                                case HIDE:
                                    if (IRCamera_m.frmIRAY_m != null)
                                    {
                                        IRCamera_m.frmIRAY_m.Hide();
                                    }
                                    break;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
 
                    }
                    Thread.Sleep(10);
                } while (true);
            });
        }
        public void Close()
        {
            if (sReader_m != null)
            {
                sReader_m.Close();
                sReader_m.Dispose();
                sReader_m = null;
            }
            if (sWriter_m != null)
            {
                sWriter_m.Close();
                sWriter_m.Dispose();
                sWriter_m = null;
            }
            if (serverStream_m != null)
            {
                serverStream_m.Close();
                serverStream_m.Dispose();
                serverStream_m = null;
            }
        }
    }
}


2、客户端代码

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace NamedPipeComm
{
    public class PipeClient
    {
        public bool IsConnect
        {
            get;
            set;
        }
 
        private NamedPipeClientStream clientStream_m = null;
        //private BinaryReader sReader_m;
        //private BinaryWriter sWriter_m;
        private StreamReader sReader_m;
        private StreamWriter sWriter_m;
 
        private const string TOTAL_TEMP = "TOTAL";
        private const string SINGLE_TEMP = "SINGLE";
        private const string IS_CONNECT = "CONNECT";
        private const string SHOW = "SHOW";
        private const string HIDE = "HIDE";
        private const string CLOSE = "CLOSE";
 
        public PipeClient(string serverName)
        {
            clientStream_m = new NamedPipeClientStream(serverName);
            //sReader_m = new BinaryReader(clientStream_m);
            //sWriter_m = new BinaryWriter(clientStream_m);
            sReader_m = new StreamReader(clientStream_m);
            sWriter_m = new StreamWriter(clientStream_m);
            try
            {
                clientStream_m.Connect(3000);
            }
            catch (Exception ex)
            {
 
            }
        }
 
        public bool Open()
        {
            IsConnect = false;
            if (QueryLine(IS_CONNECT) == IS_CONNECT)
            {
                IsConnect = true;
                return IsConnect;
            }
            return IsConnect;
        }
        public void Close()
        {
            if (sReader_m != null)
            {
                sReader_m.Close();
                sReader_m.Dispose();
                sReader_m = null;
            }
            if (sWriter_m != null)
            {
                sWriter_m.Close();
                sWriter_m.Dispose();
                sWriter_m = null;
            }
            if (clientStream_m != null)
            {
                clientStream_m.Close();
                clientStream_m.Dispose();
                clientStream_m = null;
            }
        }
        public string QueryLine(string str)
        {
            string result = "";
            try
            {
                sWriter_m.WriteLine(str);
                sWriter_m.Flush();
                DateTime start = DateTime.Now;
                do
                {
                    result = sReader_m.ReadLine();
 
                    if (start.Subtract(DateTime.Now).TotalSeconds > 5 || result != "")
                    {
                        break;
                    }
                } while (true);
            }
            catch (Exception ex)
            {
            }
            return result;
        }
 
        /// <summary>
        /// 获取ROI温度信息,返回值索引:0=均值,1=最小值,2=最大值
        /// </summary>
        /// <param name="index">ROI索引0~,注意需小于选择的ROI个数,否则返回错误数据</param>
        /// <returns></returns>
        public float[] GetTempInfoROI(int index)
        {
            float[] value = new float[3];
            string write = SINGLE_TEMP + "," + index.ToString();
            string[] reads = QueryLine(write).Split(',');
            try
            {
                value[0] = Convert.ToSingle(reads[0]);
                value[1] = Convert.ToSingle(reads[1]);
                value[2] = Convert.ToSingle(reads[2]);
            }
            catch (Exception ex)
            {
 
            }
            return value;
        }
 
        /// <summary>
        /// 获取ROI合计温度信息,返回值索引:0=均值,1=最小值,2=最大值
        /// </summary>
        /// <returns></returns>
        public float[] GetTempInfoTotalROI()
        {
            float[] value = new float[3];
            string write = TOTAL_TEMP;
            string[] reads = QueryLine(write).Split(',');
            try
            {
                value[0] = Convert.ToSingle(reads[0]);
                value[1] = Convert.ToSingle(reads[1]);
                value[2] = Convert.ToSingle(reads[2]);
            }
            catch (Exception ex)
            {
 
            }
            return value;
        }
 
        public void ShowForm()
        {
            try
            {
                sWriter_m.WriteLine(SHOW);
                sWriter_m.Flush();
            }
            catch (Exception ex)
            {
            }
        }
        public void HideForm()
        {
            try
            {
                sWriter_m.WriteLine(HIDE);
                sWriter_m.Flush();
            }
            catch (Exception ex)
            {
            }
        }
        public void ReleaseSDK()
        {
            try
            {
                sWriter_m.WriteLine(CLOSE);
                sWriter_m.Flush();
            }
            catch (Exception ex)
            {
            }
        }
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值