public Task InitializeAsync()
    {
        Tuple <Nerdbank.FullDuplexStream, Nerdbank.FullDuplexStream> streams = Nerdbank.FullDuplexStream.CreateStreams();

        this.InitializeFormattersAndHandlers();

        var serverHandler = new LengthHeaderMessageHandler(streams.Item1.UsePipe(), this.serverMessageFormatter);
        var clientHandler = new LengthHeaderMessageHandler(streams.Item2.UsePipe(), this.clientMessageFormatter);

        this.serverRpc = new JsonRpc(serverHandler, this.server);
        this.clientRpc = new JsonRpc(clientHandler);

        // Don't use Verbose as it has nasty side-effects leading to test failures, which we need to fix!
        this.serverRpc.TraceSource = new TraceSource("Server", SourceLevels.Information);
        this.clientRpc.TraceSource = new TraceSource("Client", SourceLevels.Information);

        this.serverRpc.TraceSource.Listeners.Add(new XunitTraceListener(this.Logger));
        this.clientRpc.TraceSource.Listeners.Add(new XunitTraceListener(this.Logger));

        this.serverRpc.StartListening();
        this.clientRpc.StartListening();

        this.clientProxy = new Lazy <IServer>(() => this.clientRpc.Attach <IServer>());

        return(Task.CompletedTask);
    }
Ejemplo n.º 2
0
        static async Task Main(string[] args)
        {
            Console.WriteLine("正在与服务端建立连接...");
            var tcpClient     = new TcpClient("localhost", 6000);
            var jsonRpcStream = tcpClient.GetStream();

            Console.WriteLine("已建立连接");

            var messageFormatter = new JsonMessageFormatter(Encoding.UTF8);
            var messageHandler   = new LengthHeaderMessageHandler(jsonRpcStream, jsonRpcStream, messageFormatter);
            var greeterClient    = JsonRpc.Attach <IGreeter>(messageHandler);

            Console.WriteLine("开始向服务端发送消息...");
            var request = new HelloRequest {
                Name = "精致码农"
            };
            var response = await greeterClient.SayHelloAsync(request);

            Console.WriteLine($"收到来自服务端的响应:{response.Message}");

            Console.WriteLine(response.Message);

            Console.WriteLine("正在断开连接...");
            jsonRpcStream.Close();
            Console.WriteLine("已断开连接");

            Console.ReadKey();
        }
Ejemplo n.º 3
0
    public async Task BasicJsonRpc()
    {
        var(clientStream, serverStream) = FullDuplexStream.CreatePair();
        var clientFormatter = new MessagePackFormatter();
        var serverFormatter = new MessagePackFormatter();

        var clientHandler = new LengthHeaderMessageHandler(clientStream.UsePipe(), clientFormatter);
        var serverHandler = new LengthHeaderMessageHandler(serverStream.UsePipe(), serverFormatter);

        var clientRpc = new JsonRpc(clientHandler);
        var serverRpc = new JsonRpc(serverHandler, new Server());

        serverRpc.TraceSource = new TraceSource("Server", SourceLevels.Verbose);
        clientRpc.TraceSource = new TraceSource("Client", SourceLevels.Verbose);

        serverRpc.TraceSource.Listeners.Add(new XunitTraceListener(this.Logger));
        clientRpc.TraceSource.Listeners.Add(new XunitTraceListener(this.Logger));

        clientRpc.StartListening();
        serverRpc.StartListening();

        int result = await clientRpc.InvokeAsync <int>(nameof(Server.Add), 3, 5).WithCancellation(this.TimeoutToken);

        Assert.Equal(8, result);
    }
Ejemplo n.º 4
0
        private JsonRpcClient(string ipAddress, int port)
        {
            m_TcpClient = new TcpClient(AddressFamily.InterNetwork);
            m_TcpClient.Connect(IPAddress.Parse(ipAddress), port);
            var formatter = new JsonMessageFormatter(Encoding.UTF8);
            var handler   = new LengthHeaderMessageHandler(m_TcpClient.GetStream(), m_TcpClient.GetStream(), formatter);

            m_JsonRpc = new JsonRpc(handler);
            // Add any applicable target objects/methods here, or in the JsonRpc constructor above
            m_JsonRpc.StartListening();
        }
Ejemplo n.º 5
0
        private static JsonRpc CreateRpc(string name, Stream duplexStream)
        {
            // Create a JsonRpcMessagePackFormatter as an IJsonRpcMessageFormatter.
            var formatter = new JsonRpcMessagePackFormatter(MyCompositeResolver.Instance);

            // Create a JsonRpc that uses the IJsonRpcMessageFormatter.
            var handler = new LengthHeaderMessageHandler(duplexStream, duplexStream, formatter);
            var rpc     = new JsonRpc(handler)
            {
                TraceSource = new TraceSource(name, SourceLevels.Verbose),
            };

            rpc.AddLocalRpcTarget(new ServerObject());
            rpc.StartListening();
            return(rpc);
        }
        static async Task Main(string[] args)
        {
            TcpClient tcpClient = new TcpClient("localhost", 6000);

            Stream jsonRpcStream = tcpClient.GetStream();
            IJsonRpcMessageFormatter jsonRpcMessageFormatter = new JsonMessageFormatter(Encoding.UTF8);
            IJsonRpcMessageHandler   jsonRpcMessageHandler   = new LengthHeaderMessageHandler(jsonRpcStream, jsonRpcStream, jsonRpcMessageFormatter);

            IGreeter jsonRpcGreeterClient = JsonRpc.Attach <IGreeter>(jsonRpcMessageHandler);

            HelloReply helloReply = await jsonRpcGreeterClient.SayHelloAsync(new HelloRequest { Name = "Tomasz Pęczek" });

            Console.WriteLine(helloReply.Message);

            jsonRpcStream.Close();

            Console.ReadKey();
        }
Ejemplo n.º 7
0
        public async Task <LengthHeaderMessageHandler> GetMessageHandlerAsync()
        {
            var tries = 0;

            do
            {
                try
                {
                    var tcpClient = new TcpClient(m_ServerAddress, m_Port);

                    var jsonStream = tcpClient.GetStream();

                    var jsonRpcMessageFormatter = new JsonMessageFormatter(Encoding.UTF8);

                    var jsonRpcMessageHandler = new LengthHeaderMessageHandler(
                        jsonStream,
                        jsonStream,
                        jsonRpcMessageFormatter);

                    return(jsonRpcMessageHandler);
                }
                catch (SocketException socketException)
                {
                    Console.WriteLine($"Failed to connect, will retry {tries}/{MaxConnectionRetries}, '{socketException.Message}'");
                }
                catch (Exception exception)
                {
                    Console.WriteLine($"Failed to connect, will retry {tries}/{MaxConnectionRetries}, '{exception.Message}'");
                }
                finally
                {
                    tries++;
                    await Task.Delay(1000);
                }
            } while (tries < MaxConnectionRetries);

            throw new TimeoutException("Failed to connect to the RPC server.");
        }
Ejemplo n.º 8
0
    public async Task InitializeAsync()
    {
        Tuple <Nerdbank.FullDuplexStream, Nerdbank.FullDuplexStream> streams = Nerdbank.FullDuplexStream.CreateStreams();

        TraceSource mxServerTraceSource = new TraceSource("MX Server", SourceLevels.Information);
        TraceSource mxClientTraceSource = new TraceSource("MX Client", SourceLevels.Information);

        mxServerTraceSource.Listeners.Add(new XunitTraceListener(this.Logger));
        mxClientTraceSource.Listeners.Add(new XunitTraceListener(this.Logger));

        MultiplexingStream[] mxStreams = await Task.WhenAll(
            MultiplexingStream.CreateAsync(
                streams.Item1,
                new MultiplexingStream.Options
        {
            TraceSource = mxServerTraceSource,
            DefaultChannelTraceSourceFactory = (id, name) => new TraceSource("MX Server channel " + id, SourceLevels.Verbose)
            {
                Listeners = { new XunitTraceListener(this.Logger) }
            },
        },
                this.TimeoutToken),
            MultiplexingStream.CreateAsync(
                streams.Item2,
                new MultiplexingStream.Options
        {
            TraceSource = mxClientTraceSource,
            DefaultChannelTraceSourceFactory = (id, name) => new TraceSource("MX Client channel " + id, SourceLevels.Verbose)
            {
                Listeners = { new XunitTraceListener(this.Logger) }
            },
        },
                this.TimeoutToken));

        this.serverMx = mxStreams[0];
        this.clientMx = mxStreams[1];

        MultiplexingStream.Channel[] rpcStreams = await Task.WhenAll(
            this.serverMx.AcceptChannelAsync(string.Empty, this.TimeoutToken),
            this.clientMx.OfferChannelAsync(string.Empty, this.TimeoutToken));

        MultiplexingStream.Channel rpcServerStream = rpcStreams[0];
        MultiplexingStream.Channel rpcClientStream = rpcStreams[1];

        this.InitializeFormattersAndHandlers();

        var serverHandler = new LengthHeaderMessageHandler(rpcServerStream, this.serverMessageFormatter);
        var clientHandler = new LengthHeaderMessageHandler(rpcClientStream, this.clientMessageFormatter);

        this.serverRpc = new JsonRpc(serverHandler, this.server);
        this.clientRpc = new JsonRpc(clientHandler);

        this.serverRpc.TraceSource = new TraceSource("Server", SourceLevels.Information);
        this.clientRpc.TraceSource = new TraceSource("Client", SourceLevels.Information);

        this.serverRpc.TraceSource.Listeners.Add(new XunitTraceListener(this.Logger));
        this.clientRpc.TraceSource.Listeners.Add(new XunitTraceListener(this.Logger));

        this.serverRpc.StartListening();
        this.clientRpc.StartListening();
    }
 public void Ctor_NullReadStream()
 {
     this.handler = new LengthHeaderMessageHandler(new MemoryStream(), null, new JsonMessageFormatter());
     Assert.False(this.handler.CanRead);
     Assert.True(this.handler.CanWrite);
 }
 public LengthHeaderMessageHandlerTests(ITestOutputHelper logger)
     : base(logger)
 {
     this.handler = new LengthHeaderMessageHandler(this.halfDuplexStream, this.halfDuplexStream, new JsonMessageFormatter());
 }
 public void Ctor_NullWriter()
 {
     this.handler = new LengthHeaderMessageHandler(null, new MemoryStream().UsePipeReader(), new MessagePackFormatter());
     Assert.True(this.handler.CanRead);
     Assert.False(this.handler.CanWrite);
 }