public override async ValueTask ConnectAsync()
        {
            _cts = new CancellationTokenSource();
            if (_client == null)
            {
                Func <TransportContext> getCtx = () => _context;
                _client = new EasyClient <ReceivedPackage>(ServiceProvider.CreateInstance <ReceivedPackageFilter>(getCtx), new ChannelOptions()
                {
                    MaxPackageLength = 1024 * 1024 * 1024
                });
            }

            _client.Closed += async(o, e) =>
            {
                await DisconnectAsync();
            };


            if (await _client.ConnectAsync(new IPEndPoint(IPAddress.Parse(ConnectionAddress.IPAddress), ConnectionAddress.Port)))
            {
                IsConnected = true;
                DoReceive();
            }
            else
            {
                await DisconnectAsync();
            }
        }
예제 #2
0
        private async ValueTask SendAllRequestsInQueue(IEasyClient <Response, Request> client, int index)
        {
            if (!_uncheckedRequests.TryGetValue((EasyClient <Response>)client, out var uncheckedRequest))
            {
                return;
            }
            var success = false;

            while (!success)
            {
                success = await Connect(index);

                if (!success)
                {
                    Thread.Sleep(1000);
                }
            }
            while (_running)
            {
                if (_uncheckedRequests.Count > MaxSizeOfUncheckedRequestList)
                {
                    Thread.Sleep(100);
                    continue;
                }
                var request = await _toBeSendRequests.Dequeue();

                // 若请求已超时,则放弃
                if (request.IsTimeout)
                {
                    continue;
                }
                try
                {
                    await client.SendAsync(request.Request);

                    uncheckedRequest.Add(new Tuple <DateTime, RequestWithTimeout>(DateTime.Now, request));
                }
                catch
                {
                    if (!_running)
                    {
                        return;
                    }
                    await _toBeSendRequests.Enqueue(request,
                                                    new RequestPriority(0, request.Request.Id));

                    success = await Connect(index);

                    if (!success)
                    {
                        Thread.Sleep(200);
                    }
                }
            }
        }
예제 #3
0
        public IEasyClient <TPackageInfo> ConfigureEasyClient <TPackageInfo>(IEasyClient <TPackageInfo> client) where TPackageInfo : class
        {
            client.Security = new SecurityOptions
            {
                TargetHost          = "supersocket",
                EnabledSslProtocols = GetClientEnabledSslProtocols(),
                RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
            };

            return(client);
        }
예제 #4
0
        public HostedService(ILogger <HostedService> logger, IConfigService configService)
        {
            _logger = logger;

            var pipelineFilter = new CommandLinePipelineFilter
            {
                Decoder = new PackageDecoder()
            };

            _client = new EasyClient <PackageInfo>(pipelineFilter).AsClient();
            _config = configService.Get();
        }
예제 #5
0
        public ClientsController(IConfiguration configuration)
        {
            var serverIp = configuration["RemoteServer:Ip"];

            _serverPort = int.Parse(configuration["RemoteServer:Port"]);
            _address    = IPAddress.Parse(serverIp);

            var pipelineFilter = new CommandLinePipelineFilter
            {
                Decoder = new PackageDecoder()
            };

            _client = new EasyClient <PackageInfo>(pipelineFilter).AsClient();
        }
예제 #6
0
        public override async Task ConnectAsync()
        {
            _cancellationTokenSource = new CancellationTokenSource();
            if (_client == null)
            {
                _client = new EasyClient <ReceivedPackage>(new ReceivedPackageFilter(GetContext));
            }

            var connectSuccess = await _client.ConnectAsync(new IPEndPoint(IPAddress.Parse(ConnectionAddress.IPAddress), ConnectionAddress.Port));

            if (connectSuccess)
            {
                DoReceive();
            }
        }
예제 #7
0
        public SocketService(IConfiguration configuration, ILogger <SocketService> logger, IHubContext <SocketHub, ISocketClient> socketHub)
        {
            _serverIp   = configuration["RemoteServer:Ip"];
            _serverPort = int.Parse(configuration["RemoteServer:Port"]);

            _socketHub = socketHub;
            _logger    = logger;

            var pipelineFilter = new CommandLinePipelineFilter
            {
                Decoder = new PackageDecoder()
            };

            _client = new EasyClient <PackageInfo>(pipelineFilter).AsClient();
        }
예제 #8
0
        static async Task Main(string[] args)
        {
            client = new EasyClient <TextPackageInfo>(new MyPackageFilter()).AsClient();

            if (!await client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, 4040)))
            {
                Console.WriteLine("Failed to connect the target server.");
                return;
            }

            //client.PackageHandler += async (s, p) =>
            //{
            //    Console.WriteLine(p.Text);
            //    await Task.CompletedTask;
            //};
            //client.StartReceive();

            //var hdn = Task.Run(Receive);
            //hdn.Start();



            await client.SendAsync(Encoding.UTF8.GetBytes("Test" + "\r\n"));

            //await client.SendAsync(Encoding.UTF8.GetBytes("Test" + "\r\n"));
            //await Task.Delay(5000);
            //var p = await client.ReceiveAsync();
            //Console.WriteLine(p.Text);
            await Task.Delay(5000);

            while (true)
            {
                var p = await client.ReceiveAsync();

                if (p == null)
                {
                    break;
                }
                Console.WriteLine("接收到的数据:" + p.Text);
            }

            //while (true)
            //{
            //    var p = await client.ReceiveAsync();
            //    Console.WriteLine("接收信息:" + p.Text?.ToString());
            //}
        }
예제 #9
0
        /// <summary>
        /// 连接
        /// </summary>
        /// <returns></returns>
        public async Task ConnectAsync()
        {
            var client = new EasyClient <IJTTPackageInfo>(Filter);

            client.PackageHandler += PackageHandler;
            client.Closed         += Closed;
            EasyClient             = client.AsClient();

            try
            {
                var connected = await EasyClient.ConnectAsync(
                    new IPEndPoint(
                        IPAddress.Parse(Config.ServerHost),
                        Config.ServerPort),
                    CancellationToken.None);

                if (connected)
                {
                    Logger.Log(
                        NLog.LogLevel.Trace,
                        LogType.系统跟踪,
                        $"已连接服务器, " +
                        $"\r\t\nServer: {Config.ServerHost}:{Config.ServerPort}.");

                    StartReceive();
                }
                else
                {
                    Logger.Log(
                        NLog.LogLevel.Trace,
                        LogType.系统跟踪,
                        $"连接服务器失败, " +
                        $"\r\t\nServer: {Config.ServerHost}:{Config.ServerPort}.");
                }
            }
            catch (Exception ex)
            {
                Logger.Log(
                    NLog.LogLevel.Error,
                    LogType.系统异常,
                    $"连接服务器时发生错误, " +
                    $"\r\t\nServer: {Config.ServerHost}:{Config.ServerPort}.",
                    null,
                    ex);
            }
        }
        /// <summary>Connect to server
        /// </summary>
        public async ValueTask ConnectAsync()
        {
            if (_isConnected)
            {
                _logger.LogWarning("Socket client is connected , don't connect again !");
                return;
            }
            try
            {
                _easyClient = new EasyClient <Packet>(new PacketFilter(9));
                await _easyClient.ConnectAsync(_setting.ServerEndPoint);

                _isConnected = true;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Socket client to server '{0}' fail!", _setting.ServerEndPoint.ToStringAddress());
                _isConnected = false;
            }
        }
예제 #11
0
        private async Task InitTcp()
        {
            var options = new ChannelOptions
            {
                Logger       = NullLogger.Instance,
                ReadAsDemand = true
            };

            _client = new EasyClient <TextPackageInfo>(new LinePipelineFilter(), options).AsClient();

            var connected = await _client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, 8888));

            var connectPackage = new MessagePackage <TextMessageModel>()
            {
                OpCode      = OpCode.Connect,
                MessageType = MessageType.TextMessage,
                Message     = new TextMessageModel()
                {
                    LocalName  = TbUserName.Text,
                    RemoteName = "Server"
                }
            };
            await _client.SendAsync(
                new ReadOnlyMemory <byte>(Encoding.UTF8.GetBytes(connectPackage.ToString())));

            while (true)
            {
                var receivePackage =
                    JsonConvert.DeserializeObject <MessagePackage <TextMessageModel> >((await _client.ReceiveAsync()).Text);

                if (receivePackage.Message == null)
                {
                    continue;
                }
                switch (receivePackage.OpCode)
                {
                case OpCode.DisConnect:
                    MessageBox.Show(receivePackage.Message.TextMessage, receivePackage.Message.LocalName);
                    TbUserName.IsEnabled = true;
                    break;

                case OpCode.Connect:
                    LvOnlineList.Children.Clear();
                    var allItem = new UserItemsControl("All");
                    allItem.setRoteName = SetRoteName;
                    LvOnlineList.Children.Add(allItem);
                    foreach (var userClient in receivePackage.Clients)
                    {
                        var childItem = new UserItemsControl(userClient.Username);
                        childItem.setRoteName = SetRoteName;
                        LvOnlineList.Children.Add(childItem);
                    }

                    TbUserName.IsEnabled = false;
                    break;

                case OpCode.All:
                    this.LbCurrentChat.Content = receivePackage.Message.LocalName;
                    WpChatArea.Children.Add(new MessageControl(new TextMessageModel()
                    {
                        LocalName   = receivePackage.Message.LocalName,
                        TextMessage = receivePackage.Message.TextMessage
                    }));
                    break;

                case OpCode.Single:
                    LbCurrentChat.Content = receivePackage.Message.LocalName;
                    WpChatArea.Children.Add(new MessageControl(new TextMessageModel()
                    {
                        LocalName   = receivePackage.Message.LocalName,
                        TextMessage = receivePackage.Message.TextMessage
                    }));
                    break;
                }
                Scr.ScrollToEnd();

                if (connected)
                {
                    BdConnectState.Background = new SolidColorBrush(Colors.LimeGreen);
                    TbUserName.IsEnabled      = false;
                }
                else
                {
                    BdConnectState.Background = new SolidColorBrush(Colors.OrangeRed);
                    TbUserName.IsEnabled      = true;
                    break;
                }

                await Task.Delay(500);
            }

            //while (true)
            //{
            //    var package = await _client.ReceiveAsync();
            //    //if(package != null) SpChatArea.Text += "Receive:" + package.Text + Environment.NewLine;
            //    var data = JsonConvert.DeserializeObject<TextMessageModel>(package.Text);
            //    if (package != null)
            //    {
            //        WpChatArea.Children.Add(new MessageControl(new TextMessageModel()
            //        {
            //            LocalName = data.LocalName,
            //            TextMessage = data.TextMessage
            //        }));
            //    }
            //    await Task.Delay(500);
            //}
        }
예제 #12
0
 public IEasyClient <TPackageInfo> ConfigureEasyClient <TPackageInfo>(IEasyClient <TPackageInfo> client) where TPackageInfo : class
 {
     return(client);
 }
 public abstract IEasyClient <TPackageInfo> ConfigureEasyClient <TPackageInfo>(IEasyClient <TPackageInfo> client)
     where TPackageInfo : class;
        private async void InitTcpConnectAndReceive()
        {
            var options = new ChannelOptions
            {
                Logger       = NullLogger.Instance,
                ReadAsDemand = true
            };

            _sendTcpClient = new EasyClient <TextPackageInfo>(new LinePipelineFilter(), options).AsClient();

            _connected = await _sendTcpClient.ConnectAsync(new IPEndPoint(IPAddress.Loopback, 8888));

            var connectPackage = new TcpPackage()
            {
                OpCode      = OpCode.Connect,
                LocalName   = TbUserName.Text,
                RemoteName  = "Server",
                MessageType = MessageType.Text
            };

            await _sendTcpClient.SendAsync(
                new ReadOnlyMemory <byte>(Encoding.UTF8.GetBytes(connectPackage.ToString())));


            while (true)
            {
                var receivePackage = TcpPackage.JsonToPackage((await _sendTcpClient.ReceiveAsync()).Text);
                if (string.IsNullOrEmpty(receivePackage.Message))
                {
                    continue;
                }

                switch (receivePackage.OpCode)
                {
                case OpCode.Connect:
                    SpOnlineList.Children.Clear();
                    var allItem = new UserItemsControl("All");
                    allItem.setRoteName = SetRoteName;
                    SpOnlineList.Children.Add(allItem);
                    foreach (var onlineClient in receivePackage.Clients)
                    {
                        var childItem = new UserItemsControl(onlineClient.Username);
                        childItem.setRoteName = SetRoteName;
                        SpOnlineList.Children.Add(childItem);
                    }
                    TbUserName.IsEnabled       = false;
                    BtnConnectServer.IsEnabled = false;
                    break;

                case OpCode.DisConnect:
                    MessageBox.Show(receivePackage.Message, receivePackage.LocalName);
                    TbUserName.IsEnabled = true;
                    break;

                case OpCode.All:
                case OpCode.Single:
                    LbChatWith.Content = receivePackage.OpCode == OpCode.All
                            ? receivePackage.RemoteName : receivePackage.LocalName;
                    switch (receivePackage.MessageType)
                    {
                    case MessageType.Text:
                        ChatArea.Children.Add(new ReceiveControl(receivePackage, null));
                        break;

                    case MessageType.Image:
                        // 建立UDP客户端 直接接收消息
                        ReceiveImage(receivePackage: receivePackage);
                        break;

                    case MessageType.File:
                        var res = MessageBox.Show("是否接收文件?", "提示", MessageBoxButton.YesNo,
                                                  MessageBoxImage.Information);
                        if (res == MessageBoxResult.Yes)
                        {
                            // 发送TCP确认连接消息
                            // 创建UDP客户端
                        }
                        break;
                    }
                    break;

                case OpCode.Confirm:
                    switch (receivePackage.MessageType)
                    {
                    case MessageType.Image:
                        var fileName = await SendImage();

                        await Task.Delay(1000);
                        await SendImage(fileName, receivePackage);

                        break;

                    case MessageType.File:
                        break;
                    }
                    break;
                }

                Scr.ScrollToEnd();

                if (_connected)
                {
                    BdConnectState.Background = new SolidColorBrush(Colors.LimeGreen);
                    TbUserName.IsEnabled      = false;
                }
                else
                {
                    BdConnectState.Background = new SolidColorBrush(Colors.OrangeRed);
                    TbUserName.IsEnabled      = true;
                    break;
                }

                //await Task.Delay(1000);
            }
        }