コード例 #1
0
        public TLCFIExerciser(TwoWayTcpClient client, TLCFIExerciserSetup setup)
        {
            _client = client;
            _setup  = setup;

            var id = 0;

            _aliveTimer = new Timer(async state =>
            {
                await _client.SendDataAsync("{\"id\":" + id++ + ",\"jsonrpc\":\"2.0\"," +
                                            "\"method\":\"Alive\",\"params\":{\"ticks\":" + CurrentTicks + ",\"time\":" + CurrentTime + "}}", CancellationToken.None);
            }, null, 2000, 2000);

            _client.DataReceived += ProcessReceivedData;
        }
コード例 #2
0
 public TLCFIClientSessionJsonRpcHandler(
     TLCFIClientStateManager stateManager,
     TLCProxy tlcProxy,
     TLCFIClientSessionState sessionState,
     TwoWayTcpClient tcpClient,
     CancellationToken token)
 {
     _stateManager             = stateManager;
     _tlcProxy                 = tlcProxy;
     _sessionCancellationToken = token;
     tcpClient.DataReceived   += async(o, e) =>
     {
         if (!_jsonRpcMethodRegex.IsMatch(e))
         {
             return;
         }
         var result = _service?.HandleRpc(e);
         if (result != null)
         {
             await tcpClient.SendDataAsync(result, token);
         }
     };
     _service = JsonRpcProcedureBinder.Default.GetInstanceService(this);
 }
コード例 #3
0
        private async void ProcessReceivedData(object sender, string data)
        {
            JsonRpcRequest request;

            if (!_jsonRpcMethodRegex.IsMatch(data))
            {
                return;
            }

            try
            {
                request = JsonConvert.DeserializeObject <JsonRpcRequest>(data);
            }
            catch
            {
                _logger.Error("Data received is not a valid JSON-RPC request. Data: {0}", data);
                return;
            }

            TLCFIExerciserSetupElement response;
            string rpcresponse;

            switch (request.Method)
            {
            case "Alive":
                rpcresponse = "{\"jsonrpc\":\"2.0\",\"result\":" + request.Params + ",\"id\":" + request.Id + "}";
                await _client.SendDataAsync(rpcresponse, CancellationToken.None);

                break;

            case "UpdateState":
                // TODO
                break;

            case "Deregister":
                rpcresponse = "{\"jsonrpc\":\"2.0\",\"result\":{},\"id\":" + request.Id + "}";
                await _client.SendDataAsync(rpcresponse, CancellationToken.None);

                break;

            case "Register":
                response = _setup.Elements.FirstOrDefault(x => x.Method == "Register");
                if (response != null)
                {
                    rpcresponse = response.Response.Replace("__ID__", request.Id.ToString());
                    rpcresponse = rpcresponse.Replace("__TICKS__", CurrentTicks.ToString());
                    await _client.SendDataAsync(rpcresponse, CancellationToken.None);
                }
                break;

            case "ReadMeta":
                var rmtype = Regex.Match(request.Params.ToString(), @".*""type""\s*:\s*(?<type>[0-9]+).*");
                response = _setup.Elements.FirstOrDefault(
                    x => x.Method == "ReadMeta" &&
                    x.Type == rmtype.Groups["type"].Value);
                if (response != null)
                {
                    rpcresponse = response.Response.Replace("__ID__", request.Id.ToString());
                    rpcresponse = rpcresponse.Replace("__TICKS__", CurrentTicks.ToString());
                    await _client.SendDataAsync(rpcresponse, CancellationToken.None);
                }
                break;

            case "Subscribe":
                var sctype = Regex.Match(request.Params.ToString(), @".*""type""\s*:\s*(?<type>[0-9]+).*");
                response = _setup.Elements.FirstOrDefault(
                    x => x.Method == "Subscribe" &&
                    x.Type == sctype.Groups["type"].Value);
                if (response != null)
                {
                    rpcresponse = response.Response.Replace("__ID__", request.Id.ToString());
                    rpcresponse = rpcresponse.Replace("__TICKS__", CurrentTicks.ToString());
                    await _client.SendDataAsync(rpcresponse, CancellationToken.None);
                }
                break;

            default:
                _logger.Warn("Unknown JSON-RPC method called by client: {0}", request.Method);
                break;
            }
        }
        public void ClientConnected_SendAndReceivesInSeperateThreads_AllDataTransfered()
        {
            var listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 53872);

            listener.Start();
            var tcpclient = new TcpClient();

            tcpclient.Connect("127.0.0.1", 53872);
            var client   = new TwoWayTcpClient(tcpclient);
            var received = new StringBuilder();
            var sent     = new StringBuilder();

            client.DataReceived += (s, e) =>
            {
                received.Append(e);
            };
            var client2 = listener.AcceptTcpClient();

            client2.ReceiveBufferSize = 32768;
            client2.SendBufferSize    = 32768;

            var t1 = new Thread(async() =>
            {
                for (int i = 0; i < 10; ++i)
                {
                    Thread.Sleep(25);
                    await client.SendDataAsync("{test" + i + "}\n", CancellationToken.None);
                }
            });
            var t2 = new Thread(() =>
            {
                using (var nstr = client2.GetStream())
                {
                    using (var strw = new StreamWriter(nstr))
                    {
                        strw.AutoFlush = true;
                        using (var strr = new StreamReader(nstr))
                        {
                            for (int i = 0; i < 10; ++i)
                            {
                                Thread.Sleep(25);
                                strw.Write("{test" + i + "}");
                                sent.Append(strr.ReadLine());
                            }
                        }
                    }
                }
            });

            t1.Start();
            t2.Start();
            Thread.Sleep(500);
            client2.Close();
            client.Dispose();

            var result = "";

            for (int i = 0; i < 10; ++i)
            {
                result = result + ("{test" + i) + "}";
            }
            Assert.AreEqual(result, received.ToString());
            Assert.AreEqual(result, sent.ToString());
        }