/// <summary> /// Initializes a new instance of the <see cref="GrpcClient"/> class. /// </summary> /// <param name="channel">The channel to use to make remote calls.</param> /// <param name="host">The host<see cref="IPEndPoint"/></param> /// <param name="chunkSender">The chunkSender<see cref="IChunkSender{Command, FetchRequest, GrpcResponse}"/></param> /// <param name="chunkReceiver">The chunkReceiver<see cref="IChunkReceiver{Command}"/></param> internal GrpcClient(Channel channel, IPEndPoint host, IChunkSender <Command, FetchRequest, GrpcResponse> chunkSender = null, IChunkReceiver <Command> chunkReceiver = null) : base(channel) { this.channel = channel; this.remoteHost = host; this.chunkSender = chunkSender ?? new ChunkSender(); this.chunkReceiver = chunkReceiver ?? new ChunkReceiver(); }
/// <summary> /// Initializes a new instance of the <see cref="GRPCServer"/> class. /// </summary> /// <param name="host">The <see cref="IPEndPoint"/></param> /// <param name="chunkSender">The chunkSender<see cref="IChunkSender{Command, FetchRequest, GrpcResponse}"/></param> /// <param name="chunkReceiver">The chunkReceiver<see cref="IChunkReceiver{Command}"/></param> internal GRPCServer(IPEndPoint host, IChunkSender <Command, FetchRequest, GrpcResponse> chunkSender, IChunkReceiver <Command> chunkReceiver) { this.Host = host; this.chunkSender = chunkSender; this.chunkReceiver = chunkReceiver; this.chunkReceiver.FileReceived = async(cmd, streamId, token, header) => { // This creates a dummy stream only to receive the File and also because the main stream already exists in the subscription handler // The stream will be closed as soon as the file is being successfully received or a timeout happend IStream <Command> stream = new GrpcStream(null, null, streamId); (stream as GrpcStream).Connected = true; await this.OnCommand?.Invoke(cmd, streamId, token, header); }; }
/// <summary> /// Creates the specific communication client based on grpc technoligy /// </summary> /// <param name="address">The address.</param> /// <param name="chunkSender">The chunkSender<see cref="IChunkSender{Command, FetchRequest, GrpcResponse}"/></param> /// <param name="chunkReceiver">The chunkReceiver<see cref="IChunkReceiver{Command}"/></param> /// <returns>The <see cref="IClient{Command, FetchRequest, GrpcResponse}"/></returns> public static IClient <Command, FetchRequest, GrpcResponse> Create(string address, IChunkSender <Command, FetchRequest, GrpcResponse> chunkSender, IChunkReceiver <Command> chunkReceiver) { try { var endPoint = address.ToIpEndpoint(); Channel channel = null; ChannelOption optionReceive = new ChannelOption(ChannelOptions.MaxReceiveMessageLength, GrpcStream.MaxPackageSize); ChannelOption optionSend = new ChannelOption(ChannelOptions.MaxSendMessageLength, GrpcStream.MaxPackageSize); if (System.IO.File.Exists("ca.crt")) { var cacert = System.IO.File.ReadAllText(@"ca.crt"); var clientcert = System.IO.File.ReadAllText(@"client.crt"); var clientkey = System.IO.File.ReadAllText(@"client.key"); var ssl = new SslCredentials(cacert, new KeyCertificatePair(clientcert, clientkey)); channel = new Channel(string.Format("{0}:{1}", endPoint.Address.ToString(), endPoint.Port), ssl); } else { channel = new Channel(string.Format("{0}:{1}", endPoint.Address.ToString(), endPoint.Port), ChannelCredentials.Insecure, new List <ChannelOption>() { optionReceive, optionSend }); } return(new GrpcClient(channel, endPoint, chunkSender, chunkReceiver)); } catch (Exception ex) { throw new Exception("Grpc initialization error", ex); } }
/// <summary> /// Creates the specific communication server /// </summary> /// <param name="host">The <see cref="IPEndPoint"/></param> /// <param name="chunkSender">The chunkSender<see cref="IChunkSender{Command, FetchRequest, GrpcResponse}"/></param> /// <param name="chunkReceiver">The chunkReceiver<see cref="IChunkReceiver{Command}"/></param> /// <returns>The <see cref="IServer{IMessage}"/></returns> public static IServer <Command, FetchRequest, GrpcResponse> Create(IPEndPoint host, IChunkSender <Command, FetchRequest, GrpcResponse> chunkSender, IChunkReceiver <Command> chunkReceiver) { return(new GRPCServer(host, chunkSender, chunkReceiver)); }