服务器
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);
// }
//}
}
}
此为本机同进程内通信,管道的读写为阻塞方式,不能同时读和写。