在解决方案下面新建两个项目:Client和Server,两者的输出类型均为“Windows 应用程序”。整个程序的结构如下图所示。
Client仅包含一个名为“客户端”的窗体,如下图所示。
编写窗体后端代码,如下所示。
using System; using System.IO; using System.IO.Pipes; using System.Security.Principal; using System.Windows.Forms; namespace Client { public partial class frmClient : Form { NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost", "testpipe", PipeDirection.InOut, PipeOptions.Asynchronous, TokenImpersonationLevel.None); StreamWriter sw = null; public frmClient() { InitializeComponent(); } private void frmClient_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("未建立连接,不能发送消息。"); } } } }
Server项目仅包含一个名为“服务端”的窗体,如下图所示。
编写窗体后端代码,如下所示。
using System; using System.IO; using System.IO.Pipes; using System.Threading; using System.Windows.Forms; namespace Server { public partial class frmServer : Form { NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut,1,PipeTransmissionMode.Message,PipeOptions.Asynchronous); public frmServer() { InitializeComponent(); } private void frmServer_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.Items.Add(sr.ReadLine()); }); } }, pipeServer); }); } } }
运行Server.exe与Client.exe程序,效果如下图所示。
实例中共发送三次消息,分别传递数据1,2,3。
本例中演示的客户端和服务端程序均位于本地机器,使用命名管道可以与网络上的其他进程进行通信。