管道通信

来源:互联网 发布:知商金融 红包 编辑:程序博客网 时间:2024/05/16 15:15

服务器

using System;
using System.Collections.Generic;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading;
using VisionSystem;


namespace WindowsFormsApplication41
{
    public class Main
    {
        DelegateControl delegateControl = DelegateControl.GetInstance();
        Byte[] bytes = new Byte[10];
        Char[] chars = new Char[10];
        Decoder decoder = Encoding.UTF8.GetDecoder();
        UTF8Encoding encoding = new UTF8Encoding();
        NamedPipeServerStream pipeStream = new NamedPipeServerStream("messagepipe", PipeDirection.InOut, 1,
                PipeTransmissionMode.Message, PipeOptions.None);
        bool run = true;
        public void Init()
        {
            pipeStream.WaitForConnection();
            
        }
        public void Close()
        {
            run = false;
            pipeStream.Close();
        }
        public void Send(string message)
        { 
            byte[] bs = encoding.GetBytes(message);
            pipeStream.BeginWrite(bs, 0, bs.Length, CallBack, null);
        }
        private void CallBack(IAsyncResult ir)
        {
            pipeStream.EndWrite(ir);
            pipeStream.Flush();
            if (pipeStream.CanRead)
                pipeStream.BeginRead(bytes, 0, bytes.Length, WaitMessage, null);
        }
        private void WaitMessage(IAsyncResult ar)
        {
            string message = encoding.GetString(bytes);
            message = message.Replace("\0", "");
            if (message.Contains("@1"))
            {
                delegateControl.DelegateTextBox("MotionText", message.Replace("@1", "") + "\r\n");
            }
            else if (message.Contains("@2"))
            {
                delegateControl.DelegateTextBox("VisionText", message.Replace("@2", "") + "\r\n");
            }
            pipeStream.EndRead(ar);
            //pipeStream.BeginRead(bytes, 0, bytes.Length, WaitMessage, null);
            //pipeStream.Flush();
        }
    }   
}

客户端

using System;
using System.Collections.Generic;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading;


namespace WindowsFormsApplication41
{
    public class Motion
    {
        Decoder decoder = Encoding.UTF8.GetDecoder();
        UTF8Encoding encoding = new UTF8Encoding();
        Byte[] bytes = new Byte[10];
        Char[] chars = new Char[10];
        NamedPipeClientStream pipeStream =
                new NamedPipeClientStream(".", "messagepipe", PipeDirection.InOut);
        bool run = true;
        public void Init()
        {
            pipeStream.Connect();
            pipeStream.ReadMode = PipeTransmissionMode.Message;
            if (pipeStream.CanRead)
                pipeStream.BeginRead(bytes, 0, bytes.Length, Client, null);
        }
        public void Close()
        {
            run = false;
            pipeStream.Close();
        }
        public void Client(IAsyncResult ar)
        {
            pipeStream.EndRead(ar);
            string message=encoding.GetString(bytes);
            message = message.Replace("\0", "");
            if (message == "@1")
            {
                Thread.Sleep(1000);
                if (pipeStream.CanWrite)
                {
                    byte[] bs = encoding.GetBytes("@1Success");
                    pipeStream.Flush();
                    IAsyncResult ir = pipeStream.BeginWrite(bs, 0, bs.Length, null, null);
                    pipeStream.EndWrite(ir);
                }
            }
            
            pipeStream.BeginRead(bytes, 0, bytes.Length, Client, null);
            pipeStream.Flush();
        }
        //public void Send()
        //{
        //    byte[] bs = encoding.GetBytes("@1Success");
        //    if (pipeStream.CanWrite)
        //    {
        //        pipeStream.Flush();
        //        IAsyncResult ir = pipeStream.BeginWrite(bs, 0, bs.Length, null, null);
        //        pipeStream.EndWrite(ir);
        //    }
        //}
    }
}

此为本机同进程内通信,管道的读写为阻塞方式,不能同时读和写。

原创粉丝点击