示例#1
0
        static void Main(string[] args)
        {
            var tlsCertificate = new X509Certificate2("gateway.tests.com.pfx", "password");

            var listenSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);

            listenSocket.Bind(new IPEndPoint(IPAddress.Any, 10003));
            listenSocket.Listen(2000);
            Enumerable.Repeat(0, ThreadCount).Select(async(x) =>
            {
                while (listenSocket.IsBound)
                {
                    try
                    {
                        var socket = await listenSocket.AcceptAsync();
                        var ignore = Task.Run(async() =>
                        {
                            SslStream sslStream = null;
                            try
                            {
                                socket.NoDelay = true;
                                var netStream  = new NetworkStream(socket);
                                //var bufferedStream = new BufferedStream(netStream, 2048);
                                sslStream = new SslStream(netStream);
                                await sslStream.AuthenticateAsServerAsync(tlsCertificate, false, SslProtocols.Tls12 | SslProtocols.Tls11, true);
                                var messenger = new Messenger(sslStream);
                                while (true)
                                {
                                    (var length, var message) = await messenger.ReadAsync();
                                    if (length <= 0)
                                    {
                                        Console.WriteLine("out: {0}", length);
                                        break;
                                    }
                                    await messenger.WriteAsync(length, message);
                                }
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("Error serving connection: " + ex);
                                sslStream?.Close();
                            }
                        });
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error accepting socket: " + ex);
                    }
                }
            }).ToArray();

            //InternalLoggerFactory.DefaultFactory.AddProvider(new ConsoleLoggerProvider((s, level) => true, false));
            ResourceLeakDetector.Level = ResourceLeakDetector.DetectionLevel.Disabled;

            var dispatcher  = new DispatcherEventLoopGroup();
            var bossGroup   = dispatcher;
            var workerGroup = new WorkerEventLoopGroup(dispatcher);
            //var bossGroup = new MultithreadEventLoopGroup(elg => new SingleThreadEventLoop(elg, "STEL-B", TimeSpan.FromMilliseconds(200)), 1);
            //var workerGroup = new MultithreadEventLoopGroup(elg => new SingleThreadEventLoop(elg, "STEL-W", TimeSpan.FromMilliseconds(200)), ThreadCount);
            var tlsLengthEchoChannel = new ServerBootstrap()
                                       .Group(bossGroup, workerGroup)
                                       .Channel <TcpServerChannel>()
                                       //.Channel<TcpServerSocketChannel>()
                                       .Option(ChannelOption.SoBacklog, 2000)
                                       //.Option(ChannelOption.Allocator, PooledByteBufferAllocator.Default)
                                       //.ChildOption(ChannelOption.Allocator, PooledByteBufferAllocator.Default)
                                       .ChildOption(ChannelOption.TcpNodelay, true)
                                       //.Handler(new LoggingHandler("LSTN"))
                                       .ChildHandler(new ActionChannelInitializer <IChannel>(channel =>
            {
                IChannelPipeline pipeline = channel.Pipeline;
                if (tlsCertificate != null)
                {
                    pipeline.AddLast("tls", TlsHandler.Server(tlsCertificate));
                }
                pipeline.AddLast("framing-enc", new LengthFieldPrepender(4));
                pipeline.AddLast("framing-dec", new LengthFieldBasedFrameDecoder(int.MaxValue, 0, 4, 0, 4));
                pipeline.AddLast("echo", new EchoServerHandler());
                //pipeline.AddLast("Log", new LoggingHandler("CONN"));
            }))
                                       .BindAsync(IPAddress.Any, 10001).Result;

            Console.WriteLine("All listening");
            Console.ReadLine();
            tlsLengthEchoChannel.CloseAsync().Wait();
            Console.WriteLine("All done");
        }