static void Main(string[] args) { var serverCertificate = BuildSelfSignedServerCertificate("localhost"); var clientCertificate = BuildSelfSignedClientCertificate("localClient"); var clientCertificateCollection = new X509CertificateCollection(new X509Certificate[] { clientCertificate }); Guid client1Id = Guid.NewGuid(); Guid client2Id = Guid.NewGuid(); clientNames.Add(client1Id, "Client1"); clientNames.Add(client2Id, "Client2"); var servicePort = new IPEndPoint(IPAddress.Loopback, 60001); TcpListener server = new TcpListener(servicePort); server.Start(); var acceptConnecting = server.AcceptTcpClientAsync(); using (TcpClient tcpClient2 = new TcpClient("localhost", 60001)) using (TcpClient tcpClient1 = acceptConnecting.Result) using (SslStream stream2 = new SslStream(tcpClient2.GetStream(), false, CertificateValidation)) using (SslStream stream1 = new SslStream(tcpClient1.GetStream(), false, CertificateValidation)) { var serverAuth = stream1.AuthenticateAsServerAsync(serverCertificate); stream2.AuthenticateAsClient("localhost", clientCertificateCollection, false); serverAuth.Wait(); server.Stop(); RemoteHubOverStream <string> client1 = new RemoteHubOverStream <string>(client1Id, stream1, stream1, Received); RemoteHubOverStream <string> client2 = new RemoteHubOverStream <string>(client2Id, stream2, stream2, Received); client1.Start(); client2.Start(); Guid virtualHostId = Guid.NewGuid(); client1.ApplyVirtualHosts(new KeyValuePair <Guid, VirtualHostSetting>(virtualHostId, new VirtualHostSetting(0, 2))); client2.ApplyVirtualHosts(new KeyValuePair <Guid, VirtualHostSetting>(virtualHostId, new VirtualHostSetting(0, 1))); bool shouldContinue = true; while (shouldContinue) { Console.WriteLine(@"Press: 1: Send from client 1 to client 1 2: Send from client 1 to client 2 3: Send from client 2 to client 1 4: Send from client 2 to client 2 0: Send from client 1 to virtual host (1:67%/2:34%) Other: Shutdown."); var key = Console.ReadKey(true); switch (key.Key) { case ConsoleKey.D1: client1.SendMessage(client1Id, "From 1 to 1"); break; case ConsoleKey.D2: client1.SendMessage(client2Id, "From 1 to 2"); break; case ConsoleKey.D3: client2.SendMessage(client1Id, "From 2 to 1"); break; case ConsoleKey.D4: client2.SendMessage(client2Id, "From 2 to 2"); break; case ConsoleKey.D0: if (client1.TryResolveVirtualHost(virtualHostId, out var hostId)) { client1.SendMessage(hostId, "From 1 to virtual host (1:67%/2:34%)"); } break; default: shouldContinue = false; break; } } client1.Stop(); client2.Stop(); Console.WriteLine("Done. Press any key to quit..."); Console.ReadKey(true); } }
static void Main(string[] args) { //Init Console.Write("Enter your name and press enter <Empty = Exit>: "); var name = Console.ReadLine(); if (string.IsNullOrWhiteSpace(name)) { return; } //Stream TcpClient tcpClient = new TcpClient(); tcpClient.Connect(serverIP, serverPort); var clientCertificate = BuildSelfSignedClientCertificate("localClient"); var clientCertificateCollection = new X509CertificateCollection(new X509Certificate[] { clientCertificate }); SslStream stream1 = new SslStream(tcpClient.GetStream(), false, (sender, certificate, chain, sslPolicyErrors) => true /*always return true in certificate test in this demo*/); stream1.AuthenticateAsClient(serverIP.ToString(), clientCertificateCollection, false); //Remote Hub var siteId = Guid.NewGuid(); remoteHub = new RemoteHubOverStream <string>(siteId, stream1, stream1, OnMessageReceivedFromHub); //Remote Agency remoteAgency = new RemoteAgencyManagerEncapsulated(true, false, siteId); remoteAgency.MessageForSendingPrepared += OnMessageForSendingPrepared; remoteAgency.DefaultTargetSiteId = ServerId.SiteId; var chatServer = remoteAgency.AddProxy <IChatServer>(ServerId.ServiceId, out var instanceId); remoteHub.Start(); remoteAgency.Connect(); chatServer.MessageReceived += ChatServer_MessageReceived; Console.WriteLine("Started. Please chat and press enter. Empty = Exit."); while (true) { var text = Console.ReadLine(); if (string.IsNullOrWhiteSpace(text)) { break; } chatServer.SendMessage(name, text); } ((IDisposable)chatServer).Dispose(); remoteAgency.Disconnect(false); remoteHub.Stop(); remoteAgency.Dispose(); remoteHub.Dispose(); stream1.Close(); stream1.Dispose(); tcpClient.Close(); tcpClient.Dispose(); }