Exemple #1
0
 private void btnStop_Click(object sender, EventArgs e)
 {
     if (client != null)
     {
         client.Disconnect();
     }
 }
        void OnRead(TcpSocketClient client, byte[] buffers)
        {
            ThreadCalls(() =>
            {
                try
                {
                    BaseCommand cmd = new BaseCommand(buffers);
                    switch (cmd.Command)
                    {
                    case Commands.Bind:
                        var bind = new Bind(buffers);
                        this.BindHandler(client, bind);
                        break;

                    case Commands.UnBind:
                        var unbind = new UnBind(buffers);
                        this.UnBindHandler(client, unbind);
                        break;

                    case Commands.Submit:
                        var submit = new Submit(buffers);
                        this.SubmitHandler(client, submit);
                        PrintLog("接收到 \"" + submit.SPNumber + "\" 发送送给 \"" + submit.UserNumber + "\" 的消息: " + submit.MessageContent);
                        break;

                    case Commands.Deliver_Resp:
                        this.DeliverRespHandler(client, new Deliver_Resp(buffers));
                        break;

                    case Commands.Report_Resp:
                        this.ReportRespHandler(client, new Report_Resp(buffers));
                        break;

                    default:
                        break;
                    }

                    PrintLog("接收到一条 \"" + client.LocalIPAddress + "\" 发送的命令:" + Commands.GetString(cmd.Command));
                }
                catch (Exception e)
                {
                    if (e is BadCmdHeadException)
                    {
                        PrintLog(client.LocalIPAddress + " 发送错误的消息头格式!");
                    }
                    else if (e is BadCmdBodyException)
                    {
                        PrintLog(client.LocalIPAddress + " 发送错误的消息体格式!");
                    }
                    else
                    {
                        PrintLog("接受 \"" + client.LocalIPAddress + "\" 发送的消息出现错误:" + e.Message);
                    }

                    //断开连接
                    client.Disconnect();
                }
            });
        }
Exemple #3
0
 /// <summary>
 ///     Starts the local HTTP server and listen for requests
 /// </summary>
 /// <returns>Task completion object</returns>
 /// <exception cref="InvalidOperationException">
 ///     If failed to find an unused port or prohibited from listening for new
 ///     connections.
 /// </exception>
 public virtual async Task RunServerAsync()
 {
     if (Server != null)
         return;
     const ushort validPortsMin = 1025;
     const ushort validPortsMax = ushort.MaxValue;
     var invalidPorts = new List<ushort>();
     var random = new Random();
     while (invalidPorts.Count < validPortsMax - validPortsMin)
     {
         PortNumber = (ushort) random.Next(validPortsMin, validPortsMax);
         if (invalidPorts.Contains(PortNumber))
             continue;
         try
         {
             Server = new HttpListener(TimeSpan.FromSeconds(30));
             await Server.StartTcpRequestListener(PortNumber);
             Server.HttpRequestObservable.Subscribe(OnHttpRequest);
             using (var testSocket = new TcpSocketClient())
             {
                 var tokenSource = new CancellationTokenSource();
                 var connectOperation = testSocket.ConnectAsync("127.0.0.1", PortNumber.ToString(), false,
                     tokenSource.Token);
                 tokenSource.CancelAfter(TimeSpan.FromSeconds(10));
                 await connectOperation;
                 if (connectOperation.IsFaulted || connectOperation.IsCanceled)
                 {
                     if (connectOperation.Exception != null)
                         throw connectOperation.Exception;
                     throw new InvalidOperationException();
                 }
                 testSocket.Disconnect();
             }
             Protocol = @"http://127.0.0.1:" + PortNumber;
         }
         catch (NotImplementedException)
         {
             Server = null;
             throw;
         }
         catch
         {
             invalidPorts.Add(PortNumber);
             try
             {
                 Server?.StopTcpRequestListener();
             }
             catch
             {
                 // ignored
             }
             Server = null;
             continue;
         }
         return;
     }
     throw new InvalidOperationException(@"There is no free port to bind to on this machine.");
 }
        void OnSend(TcpSocketClient client, byte[] buffers)
        {
            ThreadCalls(() =>
            {
                try
                {
                    BaseCommand cmd = new BaseCommand(buffers);
                    switch (cmd.Command)
                    {
                    case Commands.UnBind:
                    case Commands.UnBind_Resp:
                        client.Disconnect();
                        break;

                    case Commands.Bind_Resp:
                        //绑定验证出错则断开连接
                        var bindresp = new Bind_Resp(buffers);
                        if (bindresp.Result != CommandError.Success)
                        {
                            client.Disconnect();
                        }
                        else
                        {
                            StartWaitSendThread(client);
                        }
                        break;

                    default:
                        break;
                    }

                    PrintLog("发送一条命令 \"" + Commands.GetString(cmd.Command) + "\" 给 \"" + client.LocalIPAddress + "\"");
                }
                catch (Exception e)
                {
                    PrintLog("发送一条命令给 \"" + client.LocalIPAddress + "\" 出现错误:" + e.Message);
                }
            });
        }
        private static async void StartTcpClient()
        {
            var tcpClient = new TcpSocketClient();
            await tcpClient.ConnectAsync("www.abc.dk", "8088", secure : true, ignoreServerCertificateErrors : true);

            var helloWorld = "Hello World!";

            var bytes = Encoding.UTF8.GetBytes(helloWorld);
            await tcpClient.WriteStream.WriteAsync(bytes, 0, bytes.Length);

            tcpClient.Disconnect();
            tcpClient.Dispose();
        }
Exemple #6
0
        void OnRead(TcpSocketClient client, byte[] buffers)
        {
            ThreadCalls(() =>
            {
                try
                {
                    var cmd = new BaseCommand(buffers);

                    switch (cmd.Command)
                    {
                    case Commands.Bind_Resp:
                        var bind_resp = new Bind_Resp(buffers);
                        if (bind_resp.Result != CommandError.Success)
                        {
                            PrintLog("绑定验证失败:" + CommandError.GetMessage(bind_resp.Result));
                            Thread.Sleep(1000);
                            client.Disconnect();
                        }
                        break;

                    case Commands.Deliver:
                        var deliver = new Deliver(buffers);
                        //新消息提醒
                        PrintLog("收到一条 " + deliver.UserNumber + " 发来的新消息!");
                        //绑定消息会话
                        BindSession(false, deliver.UserNumber, deliver.MessageContent);
                        //发送响应
                        client.Send(new Deliver_Resp
                        {
                            SequenceNumber = deliver.SequenceNumber,
                            Result         = CommandError.Success
                        }.GetBytes());
                        break;

                    case Commands.Deliver_Resp:
                        var deliver_resp = new Deliver_Resp(buffers);
                        if (deliver_resp.Result != CommandError.Success)
                        {
                            PrintLog("传送消息失败:" + CommandError.GetMessage(deliver_resp.Result));
                        }
                        break;

                    case Commands.Report:
                        client.Send(new Report_Resp
                        {
                            SequenceNumber = cmd.SequenceNumber,
                            Result         = CommandError.Success
                        }.GetBytes());
                        break;

                    default:
                        break;
                    }

                    PrintLog("接收一条命令:" + Commands.GetString(cmd.Command));
                }
                catch (Exception e)
                {
                    PrintLog("读取消息出现错误: " + e.Message);
                }
            });
        }
Exemple #7
0
        private async Task <bool> ExecSendCommand()
        {
            #region TCP listener

            //var communicationInterface = new CommunicationsInterface();
            //var allInterfaces = communicationInterface.GetAllInterfaces();
            //var networkInterface = allInterfaces.FirstOrDefault(x => x.IpAddress == Address);

            //tcpListener = new TcpSocketListener();

            //var obseravbleListener = await tcpListener.CreateObservableListener(80, networkInterface, false);

            //var subscriberTcpListener = obseravbleListener.Subscribe(
            //client =>
            //{
            //    //Insert your code here
            //},
            //ex =>
            //{
            //    // Insert your exception code here
            //    Console.WriteLine("Error!");
            //},
            //() =>
            //{
            //    // Insert your completed code here
            //    Console.WriteLine("End!");
            //});

            #endregion

            var command   = $"{Command}\n";
            var tcpClient = new TcpSocketClient();
            var ok        = false;

            using (var sending = UserDialogs.Instance.Loading("Invio..."))
            {
                ok = await AsyncHelper.DoFunc(async() =>
                {
                    await tcpClient.ConnectAsync(Address, Port);
                    var bytes = Encoding.ASCII.GetBytes(command);
                    await tcpClient.WriteStream.WriteAsync(bytes, 0, bytes.Length);
                }, "Problema invio comando");
            }

            //se l'invio non è andato a buon fine non aspetto la risposta
            if (!ok)
            {
                return(false);
            }

            //do tempo ad arduino di scrivere la risposta
            await Task.Delay(TimeSpan.FromSeconds(3));

            //verifico di essere ancora connesso
            if (tcpClient.IsConnected)
            {
                using (var receiving = UserDialogs.Instance.Loading("Ricezione..."))
                {
                    var cts = new CancellationTokenSource();
                    cts.CancelAfter(TimeSpan.FromSeconds(2));

                    ok = await AsyncHelper.DoFunc(async() =>
                    {
                        if (tcpClient.ReadStream.CanRead)
                        {
                            var bytes = await((NetworkStream)tcpClient.ReadStream).ReadFullyAsync(cts.Token);
                            Response  = Encoding.ASCII.GetString(bytes);
                        }
                    }, "Problema in ricezione", "Ricevuto!");
                }

                tcpClient.Disconnect();
            }
            else
            {
                ok = false;
            }

            return(ok);
        }
Exemple #8
0
 public void Stop()
 {
     _socketClient.Disconnect();
 }
Exemple #9
0
        void OnRead(TcpSocketClient client, byte[] buffers)
        {
            ThreadCalls(() =>
            {
                try
                {
                    var cmd = new BaseCommand(buffers);

                    switch (cmd.Command)
                    {
                    case Commands.Bind_Resp:
                        var bind_resp = new Bind_Resp(buffers);
                        if (bind_resp.Result != CommandError.Success)
                        {
                            PrintLog("绑定验证失败:" + CommandError.GetMessage(bind_resp.Result));
                            Thread.Sleep(1000);
                            client.Disconnect();
                        }
                        break;

                    case Commands.Deliver:
                        var deliver = new Deliver(buffers);
                        //添加接收记录
                        var sms = new SMS
                        {
                            SPNumber   = deliver.SPNumber,
                            UserNumber = deliver.UserNumber,
                            Content    = deliver.MessageContent,
                            Time       = DateTime.Now,
                            Type       = SMSTypes.RECEIVE
                        };
                        SMSHistory.Add(sms);
                        //绑定会话组
                        BindGroup(deliver.SPNumber);
                        //绑定会话
                        if (lbGroup.SelectedItem != null && lbGroup.SelectedItem.ToString() == sms.SPNumber)
                        {
                            BindSession(sms);
                        }
                        else
                        {
                            lbGroup.SelectedItem = deliver.SPNumber;
                            BindSession(deliver.SPNumber);
                        }
                        //新消息提醒
                        PrintLog("收到一条 " + sms.SPNumber + " 发来的新消息!");
                        //发送响应
                        client.Send(new Deliver_Resp
                        {
                            SequenceNumber = deliver.SequenceNumber,
                            Result         = CommandError.Success
                        }.GetBytes());
                        break;

                    case Commands.Deliver_Resp:
                        var deliver_resp = new Deliver_Resp(buffers);
                        if (deliver_resp.Result != CommandError.Success)
                        {
                            PrintLog("传送消息失败:" + CommandError.GetMessage(deliver_resp.Result));
                        }
                        break;

                    default:
                        break;
                    }

                    PrintLog("接收一条命令:" + Commands.GetString(cmd.Command));
                }
                catch (Exception e)
                {
                    PrintLog("读取消息出现错误: " + e.Message);
                }
            });
        }