跳转至

C#命名管道

类库代码

using System;
using System.IO;
using System.IO.Pipes;
using System.Text;

namespace NamedPipeHelper
{
    public abstract class NamedPipeInfo
    {
        /// <summary>
        /// . 表示本机,可以用localhost、127.0.0.1、本机ip 都可以
        /// </summary>
        protected const string Host = ".";
        protected const string ServerToClient = "ServeToClient";
        protected const string ClientToServer = "ClientToServer";
        protected string Recevie(string serveName, string host = Host)
        {
            using (var pipeClient = new NamedPipeClientStream(host, serveName, PipeDirection.In))
            {
                // 连接到服务器
                pipeClient.Connect();
                using (var sr = new StreamReader(pipeClient))
                {
                    return sr.ReadToEnd();
                }
            }
        }
        protected void Send(string message, string serverName)
        {
            try
            {
                // 发送数据回去给他
                using (var pipeServer = new NamedPipeServerStream(serverName, PipeDirection.Out))
                {
                    pipeServer.WaitForConnection();
                    // 直接写进streamWriter发送和写进NamedPipeServerStream,都可以发送

                    //using (var sw = new StreamWriter(pipeServer))
                    //{
                    //    sw.Write(message);
                    //}

                    using (var sw = new StreamWriter(pipeServer))
                    {
                        sw.AutoFlush = true;
                        byte[] buffer = Encoding.UTF8.GetBytes(message);
                        pipeServer.Write(buffer, 0, buffer.Length);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception();
            }
        }
        public abstract void SendMessage(string sendMessage);
        public abstract string RecevieMessage();
    }

    public sealed class NamedPipeClient : NamedPipeInfo
    {
        public override string RecevieMessage()
        {
            return Recevie(ServerToClient);
        }

        public override void SendMessage(string sendMessage)
        {
            Send(sendMessage, ClientToServer);
        }
    }
    public sealed class NamedPipeServer : NamedPipeInfo
    {
        public override string RecevieMessage()
        {
            return Recevie(ClientToServer);
        }

        public override void SendMessage(string sendMessage)
        {
            Send(sendMessage, ServerToClient);
        }
    }
}

客户端程序

using NamedPipeHelper;
using System;

namespace TestSocket
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var server = new NamedPipeClient();
            var rec = server.RecevieMessage();
            if (!string.IsNullOrEmpty(rec))
            {
                Console.WriteLine($"接受到服务器发来的:{rec}");
                server.SendMessage("hello 我是客户端");
            }
        }
    }
}

服务端程序

using System;
using NamedPipeHelper;

namespace TestSocket2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var server = new NamedPipeServer();
            server.SendMessage("你好我是服务器");
            var rev = server.RecevieMessage();
            if (!string.IsNullOrWhiteSpace(rev))
            {
                Console.WriteLine($"客户端发来{rev}");
            }
        }
    }
}

评论