static async Task Main(string[] args) { var encoder = new ProxyPackageEncoder(); var decoder = new ProxyPackageDecoder(); var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); var endpoint = new IPEndPoint(IPAddress.Any, 9091); socket.Bind(endpoint); socket.Listen(10); Console.WriteLine($"开始监听:{endpoint}"); var factory = new LoggerFactory(); var logger = factory.CreateLogger(""); while (true) { var nscoket = await socket.AcceptAsync(); Console.WriteLine($"连接成功:{nscoket.RemoteEndPoint}"); var channel = new ProxyChannel <ProxyPackage>(nscoket, encoder, decoder, logger, new ChannelOptions()); channel.PackageReceived += async(channl, package) => { Console.WriteLine($"接收到一个数据包:{package},内容:{Encoding.UTF8.GetString(package.Data)}"); var reply = new ProxyPackage { Data = Encoding.UTF8.GetBytes("你好呀") }; await channel.SendAsync(package); }; await channel.StartAsync(); } }
public async Task StartAsync() { var endpoint = new IPEndPoint(serverAddress, serverPort); var serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); await serverSocket.ConnectAsync(endpoint); proxyChannel = new ProxyChannel <ProxyPackage>(serverSocket, encoder, decoder, logger, channelOptions); proxyChannel.PackageReceived += OnPackageReceived; proxyChannel.Closed += OnProxyChannelClosed; var task = proxyChannel.StartAsync(); await proxyChannel.SendAsync(new ProxyPackage { ChannelId = channelConfig.ChannelId, Type = PackageType.Connect }); await task; }
private async Task StartProxyServer() { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); var endpoint = new IPEndPoint(IPAddress.Any, options.ServerPort); socket.Bind(endpoint); socket.Listen(options.MaxConnection); await Task.Factory.StartNew(async() => { logger.LogInformation($"ProxyServer listen on : {endpoint.Port}"); while (true) { var clientSocket = await socket.AcceptAsync(); var proxyChannel = new ProxyChannel <ProxyPackage>(clientSocket, encoder, decoder, logger, new ChannelOptions()); proxyChannel.PackageReceived += OnPackageReceived; proxyChannel.Closed += OnProxyClosedAsync; _ = proxyChannel.StartAsync(); } }); }
static async Task Main(string[] args) { var encoder = new ProxyPackageEncoder(); var decoder = new ProxyPackageDecoder(); var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); var endpoint = new IPEndPoint(IPAddress.Loopback, 9091); await socket.ConnectAsync(endpoint); var factory = new LoggerFactory(); var logger = factory.CreateLogger(""); var options = new ChannelOptions(); var channel = new ProxyChannel <ProxyPackage>(socket, encoder, decoder, logger, options); channel.PackageReceived += async(channl, package) => { Console.WriteLine($"接收到一个数据包:{package},内容:{Encoding.UTF8.GetString(package.Data)}"); await Task.CompletedTask; }; _ = channel.StartAsync(); var c = 0; while (c < 100000) { var package = new ProxyPackage { ChannelId = 1, ConnectionId = 100, Type = PackageType.Transfer, Data = Encoding.UTF8.GetBytes(c.ToString()) }; await channel.SendAsync(package); c++; } Console.ReadKey(); }
/// <summary> /// 启动一个通道,用于客户端和服务端做认证用【TODO:可以保持连接,使得不用重启客户端配置修改能够生效】 /// </summary> /// <returns></returns> private async Task StartAuthenticationAsync() { var endpoint = new IPEndPoint(IPAddress.Parse(options.ServerAddress), options.ServerPort); var authSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); await authSocket.ConnectAsync(endpoint); var authChannel = new ProxyChannel <ProxyPackage>(authSocket, encoder, decoder, logger, channelOptions); authChannel.PackageReceived += OnAuthPackageReceived; AuthChannelTask = authChannel.StartAsync(); await authChannel.SendAsync(new ProxyPackage { Type = PackageType.Authentication, Data = new AuthenticationModel { ClientId = options.ClientId, SecretKey = options.SecretKey }.ObjectToBytes() }); }