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; }
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); }
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()); }