C#使用命名管道Pipe进行进程通信实例

1.新建解决方案NamedPipeExample

  1. 新建两个项目:Client和Server,两者的输出类型均为“Windows 应用程序”。整个程序的结构如下图所示。
    在这里插入图片描述
    此Form1为Client的窗体,如下图所示。
    为
    后端代码,如下。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO;
using System.IO.Pipes;
using System.Security.Principal;

namespace Client
{
    
    
    public partial class Form1 : Form
    {
    
    
        NamedPipeClientStream pipeClient =
            new NamedPipeClientStream("localhost", "testpipe", PipeDirection.InOut, PipeOptions.Asynchronous, TokenImpersonationLevel.None);
        StreamWriter sw = null;
        public Form1()
        {
    
    
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
    
    
            try
            {
    
    
                pipeClient.Connect(5000);
                sw = new StreamWriter(pipeClient);
                sw.AutoFlush = true;
            }
            catch (Exception ex)
            {
    
    
                MessageBox.Show("连接建立失败,请确保服务端程序已经被打开。");
                this.Close();
            }
        }

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

此Form1为Server的窗体,如下图所示
在这里插入图片描述
后端代码,如下。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Server
{
    
    
    public partial class Form1 : Form
    {
    
    
        NamedPipeServerStream pipeServer =
            new NamedPipeServerStream("testpipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
        public Form1()
        {
    
    
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
    
    

        }

        private void Form1_Load(object sender, EventArgs e)
        {
    
    
            ThreadPool.QueueUserWorkItem(delegate
            {
    
    
                pipeServer.BeginWaitForConnection((o) =>
                {
    
    
                    NamedPipeServerStream pServer = (NamedPipeServerStream)o.AsyncState;
                    pServer.EndWaitForConnection(o);
                    StreamReader sr = new StreamReader(pServer);
                    while (true)
                    {
    
    
                        this.Invoke((MethodInvoker)delegate {
    
     lsvMessage.Text = sr.ReadLine(); });

                    }
                }, pipeServer);
            });
        }

        private void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
        {
    
    

        }
    }
}

先运行Server再运行Client

猜你喜欢

转载自blog.csdn.net/qq_37192571/article/details/108865099
今日推荐