public async Task Start() { CancellationTokenSource ctsConfig = new CancellationTokenSource(); CancellationTokenSource ctsHttp = new CancellationTokenSource(); //1.开启客户端连接服务 ConnectionManager = ClientConnectionManager.GetInstance(); //注册客户端发生连接时的事件 ConnectionManager.AppAdded += ConnectionManager_AppAdded; Console.WriteLine("NSmart server started"); //2.开启http服务 if (WebManagementPort > 0) { StartHttpService(ctsHttp); } //3.开启配置服务 try { await StartConfigService(ctsConfig); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Console.WriteLine("all closed"); ctsConfig.Cancel(); //listenerConsumer.Stop(); } }
public async Task Start() { ConnectionManager = ClientConnectionManager.GetInstance(); CancellationTokenSource accepting = new CancellationTokenSource(); TcpListener listenerConfigService = new TcpListener(IPAddress.Any, ConfigServicePort); Console.WriteLine("NSmart server started"); Console.WriteLine("Listening config request on port " + ConfigServicePort.ToString() + "..."); var taskResultConfig = AcceptConfigRequest(listenerConfigService); // ConnectionManager.AppAdded += ConnectionManager_AppAdded; try { await taskResultConfig; //block here to hold open the server } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Console.WriteLine("all closed"); accepting.Cancel(); //listenerConsumer.Stop(); } }
private async Task ProcessConsumeRequestAsync(int consumerPort, string clientApp, TcpClient consumerClient, CancellationToken ct) { TcpTunnel tunnel = new TcpTunnel(); tunnel.ConsumerClient = consumerClient; ClientConnectionManager.GetInstance().PortAppMap[consumerPort].Tunnels.Add(tunnel); Logger.Debug("consumer已连接:" + consumerClient.Client.RemoteEndPoint.ToString()); //II.弹出先前已经准备好的socket TcpClient s2pClient = await ConnectionManager.GetClient(consumerPort); tunnel.ClientServerClient = s2pClient; //✳关键过程✳ //III.发送一个字节过去促使客户端建立转发隧道,至此隧道已打通 //客户端接收到此消息后,会另外分配一个备用连接 s2pClient.GetStream().WriteAndFlushAsync(new byte[] { 0x01 }, 0, 1); await TcpTransferAsync(consumerClient, s2pClient, clientApp, ct); }
public async Task Start() { DbOp = new NSmartDbOperator(USER_DB_NAME, USER_DB_NAME + "_index"); InitSecureKey(); TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; CancellationTokenSource ctsConfig = new CancellationTokenSource(); CancellationTokenSource ctsHttp = new CancellationTokenSource(); CancellationTokenSource ctsConsumer = new CancellationTokenSource(); //1.反向连接池配置 ConnectionManager = ClientConnectionManager.GetInstance().SetServerContext(ServerContext); //注册客户端发生连接时的事件 ConnectionManager.AppTcpClientMapConfigConnected += ConnectionManager_AppAdded; ConnectionManager.ListenServiceClient(DbOp); Logger.Debug("NSmart server started"); //2.开启http服务 if (WebManagementPort > 0) { var httpServer = new HttpServer(Logger, DbOp, ServerContext); httpServer.StartHttpService(ctsHttp, WebManagementPort); } //3.开启心跳检测线程 ProcessHeartbeatsCheck(Global.HeartbeatCheckInterval, ctsConsumer); //4.开启配置服务(常开) try { await StartConfigService(ctsConfig); } catch (Exception ex) { Logger.Debug(ex.Message); } finally { Logger.Debug("all closed"); ctsConfig.Cancel(); ctsHttp.Cancel(); ctsConsumer.Cancel(); DbOp.Close(); } }
public async Task Start() { TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; CancellationTokenSource ctsConfig = new CancellationTokenSource(); CancellationTokenSource ctsHttp = new CancellationTokenSource(); CancellationTokenSource ctsConsumer = new CancellationTokenSource(); //1.反向连接池配置 ConnectionManager = ClientConnectionManager.GetInstance(); //注册客户端发生连接时的事件 ConnectionManager.AppTcpClientMapConfigConnected += ConnectionManager_AppAdded; Logger.Debug("NSmart server started"); //2.开启http服务 if (WebManagementPort > 0) { StartHttpService(ctsHttp); } //3.开启配置服务 try { await StartConfigService(ctsConfig); } catch (Exception ex) { Logger.Debug(ex.Message); } finally { Logger.Debug("all closed"); ctsConfig.Cancel(); //listenerConsumer.Stop(); } ////4.通过已配置的端口集合开启侦听 //foreach (var kv in ConnectionManager.PortAppMap) //{ // ListenConsumeAsync(kv.Key, ctsConsumer.Token); //} }
/// <summary> /// 同时侦听来自consumer的链接和到provider的链接 /// </summary> /// <param name="consumerlistener"></param> /// <param name="ct"></param> /// <returns></returns> async Task ListenConsumeAsync(int consumerPort, CancellationToken ct) { try { var consumerlistener = new TcpListener(IPAddress.Any, consumerPort); consumerlistener.Start(1000); //给两个listen,同时监听3端 var clientCounter = 0; while (!ct.IsCancellationRequested) { //目标的代理服务联通了,才去处理consumer端的请求。 Logger.Debug("listening serviceClient....Port:" + consumerPort); TcpClient consumerClient = await consumerlistener.AcceptTcpClientAsync(); //记录tcp隧道,消费端 TcpTunnel tunnel = new TcpTunnel(); tunnel.ConsumerClient = consumerClient; ClientConnectionManager.GetInstance().PortAppMap[consumerPort].Tunnels.Add(tunnel); Logger.Debug("consumer已连接:" + consumerClient.Client.RemoteEndPoint.ToString()); //消费端连接成功,连接 //需要端口 TcpClient s2pClient = await ConnectionManager.GetClient(consumerPort); //记录tcp隧道,客户端 tunnel.ClientServerClient = s2pClient; //✳关键过程✳ //连接完之后发送一个字节过去促使客户端建立转发隧道 await s2pClient.GetStream().WriteAsync(new byte[] { 1 }, 0, 1); clientCounter++; TcpTransferAsync(consumerlistener, consumerClient, s2pClient, clientCounter, ct); } } catch (Exception e) { Logger.Debug(e); } }