IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

TCP Server

C# .NET

class Comunication
    {
        TcpListener server = null;
        public List<Majak> activeClients;
        public MainWindow mw { get; set; }
        public bool isConOk { get; set; }
        public Comunication(string ip, int port, MainWindow _mw)
        {
            mw = _mw;
            activeClients = new List<Majak>();
            IPAddress localAddr = IPAddress.Parse(ip);
            server = new TcpListener(localAddr, port);
            server.Start();
            StartConnectionCheck();
            StartListener();
            //StartConnectionCheck();
        }
        public void StartListener()
        {
            try
            {
                while (true)
                {
                    TcpClient client = server.AcceptTcpClient();
                    if(client != null)
                    {
                        Majak m = new Majak(client);

                        Thread t = new Thread(new ParameterizedThreadStart(HandleDevice));
                        t.Start(m);
                        activeClients.Add(m);
                    }
                }
            }
            catch(SocketException e)
            {
                MessageBox.Show("Nelze spustit server", e.ToString());
                server.Stop();
            }
        }
        public void HandleDevice(Object obj)
        {
            Majak majak = (Majak)obj;
            if (majak != null && majak.isConnected)
            {
                var stream = majak.Client.GetStream();
                string imei = String.Empty;

                string data = null;
                Byte[] bytes = new Byte[256];
                int i;

                try
                {
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        string hex = BitConverter.ToString(bytes);
                        data = Encoding.ASCII.GetString(bytes, 0, i); //text který dorazil od arduina - potřeba ho dále vyhodnotit
                        DataEvaluation(data, majak);
                    }
                }
                catch (Exception e) //Pokud nastane chyba, zobrazí upozornění, odebere maják z připojených majáků a uzavře spojení
                {
                    //MessageBox.Show(e.ToString(), "Chyba při komunikaci s majákem");
                    App.Current.Dispatcher.Invoke((Action)delegate
                    {
                        activeClients.Remove(majak);
                    });
                    majak.isConnected = false;
                    majak.Client.Close();
                    return;
                }
            }
        }
        public void DataEvaluation(string d, Majak m) //vyhodnocení přijaté zprávy
        {
            //split data by ":"
            string[] datasplt = d.Split(':');
            switch(datasplt[0]){
                case "CNN":
                    m.ID = int.Parse(datasplt[1]);
                    SendResponse(1, m);
                    break;
                case "PONG":
                    isConOk = true;
                    break;
                case "PING":
                    SendResponse(3, m);
                    break;
                case "CHGTM":
                    //zavolat změnu týmu
                    m.Color = datasplt[2];
                    if(mw.SS.ChangeTeam(int.Parse(datasplt[1]), datasplt[2]))
                    {
                        SendResponse(2, m); //pokud je hra zapnutá dojde ke změnění majáku a odešle se potvrzení arduinu 
                    }
                    else
                    {
                        SendResponse(4, m); //Pokud je hra pozastavená nedojde ke změně majáku a odešle se zpráva arduinu, že hra neběží
                    }
                    break;
            }
        }
        public void SendResponse(int i, Majak m) //odpovídač
        {
            string response = null;
            Byte[] response_byte = null;
            switch (i)
            {
                case 1: //potvrdí arduinu/clientu připojení
                    //connection validation
                    response = null;
                    response = string.Format("CNN:{0}:CFM", m.ID);
                    response_byte = null;
                    response_byte = System.Text.Encoding.ASCII.GetBytes(response);
                    try
                    {
                        m.Client.GetStream().Write(response_byte, 0, response_byte.Length);
                        m.Client.GetStream().Flush();
                    }
                    catch { }
                    break;
                case 2: //potvrdí arduinu/clientu změnu týmu
                    //confirms change of team
                    response = null;
                    response = string.Format("CHGTM:{0}:{1}:CFM", m.ID, m.Color);
                    response_byte = null;
                    response_byte = System.Text.Encoding.ASCII.GetBytes(response);
                    try
                    {
                        m.Client.GetStream().Write(response_byte, 0, response_byte.Length);
                        m.Client.GetStream().Flush();
                    }
                    catch { }
                    break;
                case 3: //Pokud arduino/client pošle PING request odpoví zprávou "PONG" (pro ověření že spojení je aktivní)
                    response = null;
                    response = "PONG";
                    response_byte = null;
                    response_byte = System.Text.Encoding.ASCII.GetBytes(response);
                    try
                    {
                        m.Client.GetStream().Write(response_byte, 0, response_byte.Length);
                        m.Client.GetStream().Flush();
                    }
                    catch { }
                    break;
                case 4:
                    response = null;
                    response = string.Format("CHGTM:{0}:GMPAUSED", m.ID);
                    response_byte = null;
                    response_byte = System.Text.Encoding.ASCII.GetBytes(response);
                    try
                    {
                        m.Client.GetStream().Write(response_byte, 0, response_byte.Length);
                        m.Client.GetStream().Flush();
                    }
                    catch { }
                    break;
            }
        }
        public void StartConnectionCheck()
        {
            Thread t = new Thread(new ParameterizedThreadStart(CheckConnectionStatus));
            t.Start(mw);
        }
        public void CheckConnectionStatus(Object __mw) //vlákno používané ke kontrole připojení ke klientu/arduinu (jednou za 30 vteřin odešle zprávu "PING" následně 30 sekund čeká na odpověď "PONG" jinak klienta uzavře a smaže ze seznamu připojených klientů
        {
            while (true)
            {
                    string pingmsg = "PING";
                    Byte[] pingmsg_byte = System.Text.Encoding.ASCII.GetBytes(pingmsg);
                    Stopwatch s = new Stopwatch();

                foreach (Majak m in activeClients.ToList<Majak>())
                {
                    isConOk = false;
                    var stream = m.Client.GetStream();
                    Byte[] bytes = new Byte[256];

                    try
                    {
                        stream.Write(pingmsg_byte, 0, pingmsg_byte.Length);
                        s.Restart();
                        while (s.Elapsed < TimeSpan.FromSeconds(30) && !isConOk)
                        {

                        }
                        if (!isConOk)
                        {
                            m.isConnected = false;
                            activeClients.Remove(m);
                            m.Client.GetStream().Close();
                            m.Client.Close();
                        }
                    }
                    catch (Exception e)
                    {
                        m.isConnected = false;
                        activeClients.Remove(m);
                        m.Client.Close();
                    }
                }
                
                Thread.Sleep(30000);
            }
        }
    }

Neformátovaný

Přidáno: 1.8.2020
Expirace: Neuvedeno

Avatar
Autor: lukas.sei
Aktivity