zoukankan      html  css  js  c++  java
  • C# 管道通信 (client —— server)Framework2.0版本也可用

    //管道服务类
    public
    class PipServer { [DllImport("kernel32.dll", SetLastError = true)] public static extern SafeFileHandle CreateNamedPipe( String pipeName, //管道名 uint dwOpenMode,//管道类型 uint dwPipeMode,//管道参数 uint nMaxInstances,//管道能创建的最大实例数量 uint nOutBufferSize, //输出缓冲区长度 0表示默认 uint nInBufferSize,//输入缓冲区长度 0表示默认 uint nDefaultTimeOut,//超时时间 IntPtr lpSecurityAttributes);//指定一个SECURITY_ATTRIBUTES结构,或者传递零值 [DllImport("kernel32.dll", SetLastError = true)] public static extern int ConnectNamedPipe( SafeFileHandle hNamedPipe, IntPtr lpOverlapped); public const uint DUPLEX = (0x00000003); public const uint FILE_FLAG_OVERLAPPED = (0x40000000); public class Client { public SafeFileHandle handle; public FileStream stream; } public delegate void RecivedMessageDelegate(string message); public delegate void MessageReceivedHandler(Client client, string message); public event MessageReceivedHandler MessageReceived; public const int BUFFER_SIZE = 4096; string pipeName; Thread listenThread; bool running; List<Client> clients; public string PipeName { get { return this.pipeName; } set { this.pipeName = value; } } public bool Running { get { return this.running; } } public PipServer() { this.clients = new List<Client>(); } public void Start() { this.listenThread = new Thread(new ThreadStart(ListenForClients)); this.listenThread.Start(); this.running = true; } private void ListenForClients() { while (true) { SafeFileHandle clientHandle = CreateNamedPipe( this.pipeName, DUPLEX | FILE_FLAG_OVERLAPPED, 0, 255, BUFFER_SIZE, BUFFER_SIZE, 0, IntPtr.Zero); if (clientHandle.IsInvalid) return; int success = ConnectNamedPipe(clientHandle, IntPtr.Zero); if (success == 0) return; Client client = new Client(); client.handle = clientHandle; lock (clients) this.clients.Add(client); Thread readThread = new Thread(new ParameterizedThreadStart(Read)); readThread.Start(client); } } private void Read(object clientObj) { Client client = (Client)clientObj; client.stream = new FileStream(client.handle, FileAccess.ReadWrite, BUFFER_SIZE, true); byte[] buffer = new byte[BUFFER_SIZE]; //ASCIIEncoding encoder = new ASCIIEncoding(); UTF8Encoding encoder = new UTF8Encoding();//可以传汉字 while (true) { int bytesRead = 0; try { bytesRead = client.stream.Read(buffer, 0, BUFFER_SIZE); } catch { break; } if (bytesRead == 0) break; if (this.MessageReceived != null) this.MessageReceived(client, encoder.GetString(buffer, 0, bytesRead)); } client.stream.Close(); client.handle.Close(); lock (this.clients) this.clients.Remove(client); } public void SendMessage(string message) { lock (this.clients) { ASCIIEncoding encoder = new ASCIIEncoding(); byte[] messageBuffer = encoder.GetBytes(message); foreach (Client client in this.clients) { client.stream.Write(messageBuffer, 0, messageBuffer.Length); client.stream.Flush(); } } } }
    //启动管道服务
    public partial class Form_PipServer : Form
        {
            public Form_PipServer()
            {
                InitializeComponent();
            }
         
            private void button1_Click(object sender, EventArgs e)
            {          
                ServerPort serverPort;
                try
                {
                    serverPort = new ServerPort(this, new PipServer.RecivedMessageDelegate(DisplayMessage));
    
                    serverPort.pipeServer = new PipServer();
    
                    serverPort.PipServerStart();
    
                }
                catch
                { }
    
            }
    
            void DisplayMessage(string message)
            {
                textBox1.Text += message + "
    ";
            }
            
    
            public class ServerPort
            {
    
                private Delegate sendMessage = null;
    
                private ContainerControl mainForm;
    
                public PipServer pipeServer = null;
    
                public ServerPort(ContainerControl form, Delegate sendmessage)
                {
                    mainForm = form;
    
                    sendMessage = sendmessage;
                }
    
                void SendMsg(string msg)
                {
                    this.mainForm.Invoke(sendMessage, new Object[] { msg });
                }
    
                void PipeServer_MessageReceived(PipServer.Client client, string message)
                {
                    if (!message.Equals(""))
                    {
                        SendMsg("接收到的信息是:" + message);
                    }
                    else
                    {
                        SendMsg("消息未收到???");
                    }
                }
    
                public void MessageSend()
                {
    
                }
    
                public void PipServerStart()
                {
                    try
                    {
                        if (!this.pipeServer.Running)
                        {
                            this.pipeServer.PipeName = "\\.\Pipe\piperulecfg";//管道名称
    
                            this.pipeServer.Start();
    
                            this.pipeServer.MessageReceived += new PipServer.MessageReceivedHandler(PipeServer_MessageReceived);
                        }
                    }
                    catch
                    {
                    }
                }
            }
        }
    //客户端类 
    
    public class PipClient
        {
            [DllImport("kernel32.dll", SetLastError = true)]
    
            public static extern SafeFileHandle CreateFile(
    
               String pipeName,
    
               uint dwDesiredAccess,
    
               uint dwShareMode,
    
               IntPtr lpSecurityAttributes,
    
               uint dwCreationDisposition,
    
               uint dwFlagsAndAttributes,
    
               IntPtr hTemplate);
    
            public const uint GENERIC_READ = (0x80000000);
    
            public const uint GENERIC_WRITE = (0x40000000);
    
            public const uint OPEN_EXISTING = 3;
    
            public const uint FILE_FLAG_OVERLAPPED = (0x40000000);
    
            public delegate void MessageReceivedHandler(string message);
    
            public event MessageReceivedHandler MessageReceived;
    
            public const int BUFFER_SIZE = 4096;
    
            string pipeName;
    
            private FileStream stream;
    
            private SafeFileHandle handle;
    
            Thread readThread;
    
            bool connected;
    
            public bool Connected
            {
                get { return this.connected; }
            }
    
            public string PipeName
            {
                get { return this.pipeName; }
    
                set { this.pipeName = value; }
            }
    
            public void Connect()
            {
                this.handle =
    
                   CreateFile(  //管道属于一种特殊的文件 
    
                      this.pipeName, //创建的文件名 
    
                      GENERIC_READ | GENERIC_WRITE, //文件模式 
    
                      0,               //是否共享
    
                      IntPtr.Zero, //指向一个SECURITY_ATTRIBUTES结构的指针 
    
                      OPEN_EXISTING,//创建参数 
    
                      FILE_FLAG_OVERLAPPED,//文件属性(隐藏,只读)NORMAL为默认属性 
    
                      IntPtr.Zero);//模板创建文件的句柄 
    
                if (this.handle.IsInvalid)
                    return;
    
                this.connected = true;
    
                this.stream = new FileStream(this.handle, FileAccess.ReadWrite, BUFFER_SIZE, true);
    
                this.readThread = new Thread(new ThreadStart(Read));
    
                this.readThread.Start();
            }
    
    
            public void Read()
            {
                byte[] readBuffer = new byte[BUFFER_SIZE];
    
                ASCIIEncoding encoder = new ASCIIEncoding();
    
                while (true)
                {
                    int bytesRead = 0;
    
                    try
                    {
                        bytesRead = this.stream.Read(readBuffer, 0, BUFFER_SIZE);
                    }
                    catch
                    {
                        break;
                    }
    
                    if (bytesRead == 0)
                        break;
    
                    if (this.MessageReceived != null)
    
                        this.MessageReceived(encoder.GetString(readBuffer, 0, bytesRead));
                }
                this.stream.Close();
    
                this.handle.Close();
            }
    
            public void SendMessage(string message)
            {
                //ASCIIEncoding encoder = new ASCIIEncoding();
    
                UTF8Encoding encoder = new UTF8Encoding();//可以传汉字
    
                byte[] messageBuffer = encoder.GetBytes(message);
    
                this.stream.Write(messageBuffer, 0, messageBuffer.Length);
    
                this.stream.Flush();
            }
        }
    //客户端发送消息到服务端 
    public partial class Form_PipClient : Form
        {
            public Form_PipClient()
            {
                InitializeComponent();
            }
                    
            private void button1_Click(object sender, EventArgs e)
            {
                string szInfo = textBox1.Text;
                ClientPort.MessagePipeStart(szInfo);
            }
    
            public class ClientPort
            {
                private static PipClient pipeClient;
    
                public static void MessagePipeStart(string szInfo)
                {
                    if (pipeClient == null)
                    {
                        pipeClient = new PipClient();
    
                        pipeClient.MessageReceived += new PipClient.MessageReceivedHandler(pipeClient_MessageReceived);
                    }
    
                    if (!pipeClient.Connected)
                    {
                        pipeClient.PipeName = "\\.\Pipe\piperulecfg";
    
                        pipeClient.Connect();
                    }
    
                    if (pipeClient != null && pipeClient.Connected)
                    {
                        MessageSend(szInfo);
                    }
                    else
                    {
                        MessageBox.Show("连接建立失败,请确保服务端程序已经被打开。");
                    }
                }
    
                static void MessageSend(string str)
                {
                    pipeClient.SendMessage(str);
                }
    
    //客户端接收消息
    static void pipeClient_MessageReceived(string message) { } } }

     欢迎加群交流 QQ群 830426796

  • 相关阅读:
    ASP.NET MVC 4使用jQuery传递对象至后台方法
    大沙发斯蒂芬
    2017年年总结
    Java将HTML导出为PDF
    华硕笔记本安装Ubuntu 17.04版本
    全站启用HTTPS配置详解
    设计模式-1 单例模式
    基础知识扫盲--1 抽象类和接口
    ASP.Net 管道模型 VS Asp.Net Core 管道 总结
    索引深入理解
  • 原文地址:https://www.cnblogs.com/yc1224/p/11499009.html
Copyright © 2011-2022 走看看