博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

C# 命名管道

Posted on 2019-07-29 17:26  PHP-张工  阅读(2876)  评论(2编辑  收藏  举报

命名管道作用:方便程序跨进程通讯;

使用pipeList工具可查询系统中所有命名管道

https://docs.microsoft.com/zh-cn/sysinternals/downloads/pipelist

C#实现代码如下:

    public partial class Form1 : Form
    {
        // 命名管道客户端
        NamedPipeClientStream pipeClient = null;
        StreamWriter swClient = null;
        StreamReader srClient = null;

        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        // 创建命名管道
        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
            txtInfo.AppendText("创建命名管道" + Environment.NewLine);
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testPipe", PipeDirection.InOut))
            {
                pipeServer.WaitForConnection();

                var data = new byte[10240];
                var count = pipeServer.Read(data, 0, 10240);
                StreamReader sr = new StreamReader(pipeServer);
                using (StreamWriter sw = new StreamWriter(pipeServer))
                {
                    sw.AutoFlush = true;
                    sw.WriteLine("hello " + DateTime.Now.ToString());
                    while (true)
                    {
                        string str = sr.ReadLine();
                        File.AppendAllText(Application.StartupPath + "//log.txt", DateTime.Now.ToLocalTime().ToString() + " " + str + Environment.NewLine);
                        txtInfo.AppendText(str + Environment.NewLine);
                        sw.WriteLine("send to client " + DateTime.Now.ToString());
                        Thread.Sleep(1000);
                    }
                }
            }
        }

        // 连接命名管道
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                pipeClient = new NamedPipeClientStream("localhost", "testPipe", PipeDirection.InOut, PipeOptions.Asynchronous, TokenImpersonationLevel.None);
                pipeClient.Connect(5000);
                swClient = new StreamWriter(pipeClient);
                srClient = new StreamReader(pipeClient);
                swClient.AutoFlush = true;
                backgroundWorker2.RunWorkerAsync();

                txtInfo.AppendText("连接命名管道" + Environment.NewLine);
            }
            catch (Exception ex)
            {
                MessageBox.Show("连接建立失败,请确保服务端程序已经被打开。" + ex.ToString());
            }
        }

        // 发送消息
        private void button3_Click(object sender, EventArgs e)
        {
            if (swClient != null)
            {
                swClient.WriteLine(this.textBox1.Text);
            }
            else
            {
                MessageBox.Show("未建立连接,不能发送消息。");
            }
        }

        // 接收消息
        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                if (srClient != null)
                {
                    txtInfo.AppendText(srClient.ReadLine() + System.Environment.NewLine);
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // button1.PerformClick();
        }
    }