命名管道(C#)

基于消息传输的命名管道:

基于消息的命名管道可以传递不定长的内容,而无需传递内容长度或者结束符,上面非基于消息的传输我们都是在向管道中输入一段文本,使用WriteLine方法以回车换行作为结束符传输信息,而管道的另一端再使用ReadLine方法以读取到回车换行符作为一个消息传递结束的标志;而在使用基于消息传输时就不必这么做了

server端

class Program{

static void Main(string[] args)

{

var running = true;

while (running) // loop only for 1 client

{

PipeSecurity ps = new PipeSecurity();

//获取权限

ps.AddAccessRule(new PipeAccessRule("NETWORK SERVICE", PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));

ps.AddAccessRule(new PipeAccessRule("Users", PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));

ps.AddAccessRule(new PipeAccessRule("CREATOR OWNER", PipeAccessRights.FullControl, AccessControlType.Allow));

ps.AddAccessRule(new PipeAccessRule("SYSTEM", PipeAccessRights.FullControl, AccessControlType.Allow));

//using (var server = new NamedPipeServerStream("PIPE_NAME", PipeDirection.InOut))

using (var server = new NamedPipeServerStream("PIPE_NAME", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.None, 2048, 2048, ps))

{

server.WaitForConnection();

Console.WriteLine("Client connected");

using (var pipe = new PipeStream(server))

{

pipe.Send("handshake");

Console.WriteLine(pipe.Receive());

server.WaitForPipeDrain();

server.Flush();

}

}

}

Console.WriteLine("server closed");

Console.Read();

}

}

public class PipeStream : IDisposable

{

private readonly Stream _stream;

private readonly Reader _reader;

private readonly Writer _writer;

public PipeStream(Stream stream)

{

_stream = stream;

_reader = new Reader(_stream);

_writer = new Writer(_stream);

}

public string Receive()

{

return _reader.ReadLine();

}

public void Send(string message)

{

_writer.WriteLine(message);

_writer.Flush();

}

public void Dispose()

{

_reader.Dispose();

_writer.Dispose();

_stream.Dispose();

}

private class Reader : StreamReader

{

public Reader(Stream stream)

: base(stream)

{

}

protected override void Dispose(bool disposing)

{

base.Dispose(false);

}

}

private class Writer : StreamWriter

{

public Writer(Stream stream)

: base(stream)

{

}

protected override void Dispose(bool disposing)

{

base.Dispose(false);

}

}

}

client端

public class NamedPipeClient

{

public NamedPipeClient() { }

public bool Start(object value)

{

try

{

using (var client = new NamedPipeClientStream(".", "PIPE_NAME", PipeDirection.InOut))

{

client.Connect(2000);

var content = JsonConvert.SerializeObject(value);

using (var pipe = new PipeStream(client))

{

pipe.Receive();

client.WaitForPipeDrain();

pipe.Send(content);

}
}
return true;

}
catch (Exception ex)

{

LogHelper.Error(typeof(NamedPipeClient), "start failed"+ex.Message+ex.StackTrace);

}

return false;

}

}

public class PipeStream : IDisposable

{

private readonly Stream _stream;

private readonly Reader _reader;

private readonly Writer _writer;

public PipeStream(Stream stream)

{

_stream = stream;

_reader = new Reader(_stream);

_writer = new Writer(_stream);

}

public string Receive()

{

return _reader.ReadLine();

}

public void Send(string message)

{

_writer.WriteLine(message);

_writer.Flush();

}

public void Dispose()

{

_reader.Dispose();

_writer.Dispose();

_stream.Dispose();

}

private class Reader : StreamReader

{

public Reader(Stream stream)

: base(stream)

{

}

protected override void Dispose(bool disposing)

{

base.Dispose(false);

}

}

private class Writer : StreamWriter

{

public Writer(Stream stream)

: base(stream)

{

}

protected override void Dispose(bool disposing)

{

base.Dispose(false);

}

}

}

IIS的配置

http://dotnetmentors.com/hosting-wcf-service-with-nettcpbinding-or-netnamedpipebinding-in-iis.aspx

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,948评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,766评论 18 399
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光剑书架上的书阅读 3,937评论 2 8
  • 1. [C#语言基础]请简述拆箱和装箱。 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何...
    胤醚貔貅阅读 4,893评论 1 29
  • 我的记性越来越差了,在每个夕阳落下的晚上,我总会忘记自己已经吃过晚饭,以致于我的体重一直在往上飙升;我吹完头发后会...
    素瓜豆阅读 431评论 0 0