Skip to content

dotnet-campus/dotnetCampus.Ipc

Repository files navigation

dotnetCampus.Ipc

本机内多进程通讯库

Build NuGet

使用方法

库中提供了较为底层的通信方案,也提供了高级的封装方案(基于Json数据格式的通信方案),完整文档可参阅:

案例:直接路由Json通信(需要2.0.0-alpha版本以上)

步骤一

导入nuget包 dotnetCampus.Ipc(需要2.0.0-alpha版本以上),并引入所需要的命名空间;

using dotnetCampus.Ipc.Context;
using dotnetCampus.Ipc.IpcRouteds.DirectRouteds;
using dotnetCampus.Ipc.Pipes;

步骤二

创建实际负责IPC通信的代理对象

/// <summary>
/// 根据<paramref name="pipeName"/>创建一个 JsonIpcDirectRoutedProvider 对象
/// </summary>
/// <param name="pipeName">不同的IPC对象所使用的管道名称,一个管道名称只能被用于一个IPC对象</param>
/// <returns></returns>
private JsonIpcDirectRoutedProvider CreateJsonIpcDirectRoutedProvider(string pipeName)
{
    // 创建一个 IpcProvider,实际创建管道,进行IPC通信的底层对象
    // 可在 IpcConfiguration 进行详细的配置,包括配置断线重连、日志等级、线程池等等
    var ipcProvider = new IpcProvider(pipeName, new IpcConfiguration());

    // 创建一个 JsonIpcDirectRoutedProvider,封装了通信中的Json数据解析、简化方法调用
    var ipcDirectRoutedProvider = new JsonIpcDirectRoutedProvider(ipcProvider);

    return ipcDirectRoutedProvider;
}

步骤三

向IPC对象注册接受到指定消息后的处理函数(如果该IPC对象只负责发送消息,则它不需要注册消息处理回调)

var ipcDirectRoutedProvider = CreateJsonIpcDirectRoutedProvider("我是接收消息的IPC对象");

//对无参的通知消息注册回调函数
ipcDirectRoutedProvider.AddNotifyHandler("通知消息A", () => 
{
    Console.WriteLine("我是进程A,我收到了通知消息B,该消息无参数");
});

//对参数类型为ParamType的通知消息注册回调函数
ipcDirectRoutedProvider.AddNotifyHandler<ParamType>("通知消息B", param => 
{
    Console.WriteLine($"我是进程A,我收到了通知消息B,该消息参数:{param.Message}");
});

//对参数类型为ParamType的请求注册回调函数并返回响应数据(可以异步处理响应、也可以无参)
ipcDirectRoutedProvider.AddRequestHandler("请求消息C", (ParamType argument) =>
{
    //处理请求消息C
    var response = new IpcResponse
    {
        Message = $"我是进程A,我收到了请求消息C,该消息参数:{argument.Message}"
    };

    //返回响应数据
    return response;
});

步骤四

启动服务

var ipcDirectRoutedProvider = CreateJsonIpcDirectRoutedProvider("我是接收消息的IPC对象");

/**
一些消息注册(如果该IPC对象只负责发送消息,则它不需要注册消息处理回调;接受消息的一方需要注册接收到消息后的处理函数)
……
**/

//启动该服务
ipcDirectRoutedProvider.StartServer();

步骤五

发送消息(如果该IPC对象只负责接收和处理消息,则它不需要发送消息)

var ipcDirectRoutedProvider = CreateJsonIpcDirectRoutedProvider("我是发送消息的IPC对象");
//启动该服务
ipcDirectRoutedProvider.StartServer();
//根据接收方的管道名,获取需要接受到消息的IPC对象,并发送通知
var ipcReceivingObjectA = await ipcDirectRoutedProvider.GetAndConnectClientAsync("我是接收消息的IPC对象");
await ipcReceivingObjectA.NotifyAsync("通知消息A");
await ipcReceivingObjectA.NotifyAsync("通知消息B", new ParamType { Message = "我发送的通知消息是XXX" });
var response = await ipcReceivingObjectA.GetResponseAsync<IpcResponse>("请求消息C", new ParamType { Message = "我发送的请求消息XXX" });

调用关系图

更多案例详见: Demo

项目结构图

特点

  • 采用两个半工命名管道
  • 采用 P2P 方式,每个端都是服务端也是客户端
  • 提供 PeerProxy 机制,利用这个机制可以进行发送和接收某个对方的信息
  • 追求稳定,而不追求高性能

功能

  • 通讯建立

  • 消息收到回复机制

  • 断线重连功能

  • 大量异常处理

  • 支持裸数据双向传输方式

  • 支持裸数据请求响应模式

  • 支持字符串消息协议

  • 支持远程对象调用和对象存根传输方式

  • 支持 NamedPipeStreamForMvc (NamedPipeMvc) 客户端服务器端 MVC 模式

  • 支持直接路由的 Json 数据通讯方式

感谢

踩过的坑