管道通信

服务器

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);
        //    }
        //}
    }
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny被注册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值