mirror of
https://github.com/Azure/DotNetty.git
synced 2026-10-28 12:21:50 +08:00
Motivation: Fix up top priority issues to ensure proper working state with recent changes. Modifications: - TlsHandler negotiates TLS 1.0+ on server side (#89) - STEE properly supports graceful shutdown (#7) - UnpooledHeapByteBuffer.GetBytes honors received index and length (#88) - Echo E2E test uses length-prefix based framing (#90) Result: Setting up DotNetty does not require workarounds for shutdown and hacks to enable negotiation of higher versions of TLS. Tests are passing even with new SslStream behavior.
70 lines
2.5 KiB
C#
70 lines
2.5 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
|
|
namespace Echo.Client
|
|
{
|
|
using System;
|
|
using System.Diagnostics.Tracing;
|
|
using System.Net;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using System.Threading.Tasks;
|
|
using DotNetty.Codecs;
|
|
using DotNetty.Common.Internal.Logging;
|
|
using DotNetty.Handlers.Tls;
|
|
using DotNetty.Transport.Bootstrapping;
|
|
using DotNetty.Transport.Channels;
|
|
using DotNetty.Transport.Channels.Sockets;
|
|
using Microsoft.Practices.EnterpriseLibrary.SemanticLogging;
|
|
|
|
class Program
|
|
{
|
|
static async Task RunClient()
|
|
{
|
|
var eventListener = new ObservableEventListener();
|
|
eventListener.LogToConsole();
|
|
eventListener.EnableEvents(DefaultEventSource.Log, EventLevel.Verbose);
|
|
|
|
var group = new MultithreadEventLoopGroup();
|
|
|
|
try
|
|
{
|
|
var bootstrap = new Bootstrap();
|
|
bootstrap
|
|
.Group(group)
|
|
.Channel<TcpSocketChannel>()
|
|
.Option(ChannelOption.TcpNodelay, true)
|
|
.Handler(new ActionChannelInitializer<ISocketChannel>(channel =>
|
|
{
|
|
IChannelPipeline pipeline = channel.Pipeline;
|
|
|
|
if (EchoClientSettings.IsSsl)
|
|
{
|
|
var cert = new X509Certificate2("dotnetty.com.pfx", "password");
|
|
string targetHost = cert.GetNameInfo(X509NameType.DnsName, false);
|
|
pipeline.AddLast(TlsHandler.Client(targetHost, null, (sender, certificate, chain, errors) => true));
|
|
}
|
|
pipeline.AddLast(new LengthFieldPrepender(2));
|
|
pipeline.AddLast(new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2));
|
|
|
|
pipeline.AddLast(new EchoClientHandler());
|
|
}));
|
|
|
|
IChannel bootstrapChannel = await bootstrap.ConnectAsync(new IPEndPoint(EchoClientSettings.Host, EchoClientSettings.Port));
|
|
|
|
Console.ReadLine();
|
|
|
|
await bootstrapChannel.CloseAsync();
|
|
}
|
|
finally
|
|
{
|
|
group.ShutdownGracefullyAsync().Wait(1000);
|
|
eventListener.Dispose();
|
|
}
|
|
}
|
|
|
|
static void Main(string[] args)
|
|
{
|
|
Task.Run(() => RunClient()).Wait();
|
|
}
|
|
}
|
|
} |