예제 #1
0
        /// <summary>
        /// Funkcja uruchamiana w momencie naciśnięcia przycisku wysyłania
        /// </summary>
        /// <param name="sender">Obiekt, który odpowiedzialny jest za wysłanie eventu</param>
        /// <param name="e">Otrzymany event po naciśnięciu przycisku</param>
        private void buttonSend_Click(object sender, EventArgs e)
        {
            //Cel wysyłania naszej wiadomości, pobrany z comboBoxa
            string destination = comboBoxClients.SelectedItem.ToString();

            //Ustawienie wartości true pozwala na zatrzymanie wysyłania
            buttonStopSendingClicked = false;
            if (buttonSendClicked == false)
            {
                t = Task.Run(async() =>
                {
                    //Pętla odpowiedzialna za ciągłe wysyłanie wiadomości do wyznaczonego klienta
                    while (buttonStopSendingClicked != true)
                    {
                        short frameID = (short)(new Random()).Next(0, short.MaxValue);
                        //Pobranie wiadomości
                        string message      = textBoxMessage.Text;
                        short messageLength = (short)message.Length;
                        byte[] bytemessage;
                        List <byte[]> packageList = new List <byte[]>();
                        if (messageLength > Package.usableInfoMaxLength)
                        {
                            double numberOfPackages = (Math.Ceiling((double)messageLength / Package.usableInfoMaxLength));
                            short tmpLength         = Convert.ToInt16(messageLength - (short)((short)(numberOfPackages - 1) * Package.usableInfoMaxLength));
                            for (int i = 0; i < numberOfPackages; i++)
                            {
                                if (i < numberOfPackages - 1)
                                {
                                    bytemessage = null;
                                    EONpackage  = new Package(message.Substring(i * Package.usableInfoMaxLength, Package.usableInfoMaxLength),
                                                              1, destination, _ClientApplication.ClientIP, Convert.ToInt16(Package.usableInfoMaxLength),
                                                              Convert.ToInt16(i + 1), (short)(-1), (short)(-1), (short)(-1), (short)(-1), frameID, Convert.ToInt16(numberOfPackages));
                                    bytemessage = EONpackage.toBytes();
                                }
                                else
                                {
                                    bytemessage = null;
                                    EONpackage  = new Package(message.Substring(i * Package.usableInfoMaxLength, messageLength - i * Package.usableInfoMaxLength),
                                                              1, destination, _ClientApplication.ClientIP, tmpLength, Convert.ToInt16(i + 1),
                                                              (short)(-1), (short)(-1), (short)(-1), (short)(-1), frameID, Convert.ToInt16(numberOfPackages));
                                    bytemessage = EONpackage.toBytes();
                                }
                                packageList.Add(bytemessage);
                            }


                            if (send.Connected)
                            {
                                for (int i = 0; i < packageList.Count(); i++)
                                {
                                    string timestamp2 = Timestamp.generateTimestamp();

                                    //Wysłanie wiadomości (tablicy bajtów) za pośrednictwem gniazda
                                    sS.SendingPackageBytes(send, packageList[i]);
                                    _ClientApplication.updateLogTextBox("[" + timestamp2 + "] == SENDING PACKAGE number: " + (i + 1) + " == ");

                                    var wait = await Task.Run(async() =>
                                    {
                                        Stopwatch sw = Stopwatch.StartNew();
                                        await Task.Delay(10);
                                        sw.Stop();
                                        return(sw.ElapsedMilliseconds);
                                    });
                                }
                            }

                            //Stworzenie znacznika czasowego
                            string timestamp = Timestamp.generateTimestamp();

                            _ClientApplication.updateLogTextBox("[" + timestamp + "] == SENDING MESSAGE in " + numberOfPackages + " packages  == " + " D_ClientIP " + destination);
                        }
                        else
                        {
                            //Stworzenie wysyłanej paczki
                            bytemessage = null;
                            EONpackage  = new Package(message, 1, destination, _ClientApplication.ClientIP, messageLength, Convert.ToInt16(1), (short)(-1), (short)(-1), (short)(-1),
                                                      (short)(-1), frameID, 1);
                            bytemessage = EONpackage.toBytes();
                            //Stworzenie znacznika czasowego
                            string timestamp = Timestamp.generateTimestamp();
                            //Zamiana paczki na tablicę bajtów

                            if (send.Connected)
                            {
                                //Wysłanie wiadomości (tablicy bajtów) za pośrednictwem gniazda
                                sS.SendingPackageBytes(send, bytemessage);
                                //Zaktualizowanie LogEventTextBoxa
                                _ClientApplication.updateLogTextBox("[" + timestamp + "] == SENDING MESSAGE ==  D_ClientIP " + destination);
                            }
                        }

                        //Task, który służy wprowadzeniu opóźnienia między kolejnymi wysłanymi pakietami
                        var delay = await Task.Run(async() =>
                        {
                            Stopwatch sw = Stopwatch.StartNew();
                            await Task.Delay(3000);
                            sw.Stop();
                            return(sw.ElapsedMilliseconds);
                        });
                    }
                });
            }

            //Zablokowanie podwójnego naciśnięcia przycisku wysyłania
            buttonSendClicked = true;
        }
        /// <summary>
        /// Funkcja uruchamiana w momencie naciśnięcia przycisku połączenie z chmura
        /// </summary>
        /// <param name="sender">Obiekt, który odpowiedzialny jest za wysłanie eventu</param>
        /// <param name="e">Otrzymany event po naciśnięciu przycisku</param>
        private void buttonConnectToCloud_Click(object sender, EventArgs e)
        {
            if (buttonConnectToCloudClicked == false)
            {
                buttonConnectToCloud.Enabled = false;
                buttonConnectToCloudClicked  = true;
                string sourceIp;
                //Pobranie indeksu na którym w liście znajduje się IP naszej klienckiej aplikacji
                int cloudipindex = clientsiplist.IndexOf(_ClientApplication.ClientIP);
                //Pobranie IP chmury z listy
                string cloudIP = cloudsiplist[cloudipindex];
                try
                {
                    //Wiadomość która będzie otrzymywana
                    string message2 = null;
                    //Inicjalizacja ilości paczek
                    int numberOfPackages = 0;
                    //Inicjalizacja ID paczki
                    short frameID;
                    //Próba połączenia się z IP chmury, z którego bedziemy nasłuchiwali wiadomości
                    send = sS.ConnectToEndPoint(cloudIP);
                    if (send.Connected)
                    {
                        //Uruchomienie nasłuchiwania w aplikacji klienckiej
                        socket = sl.ListenAsync(_ClientApplication.ClientIP);
                        Task.Run(() =>
                        {
                            while (true)
                            {
                                //Odebrana wiadomość w postaci bytes
                                byte[] messagebytes;
                                //Zamienienie odebranej wiadomości na tablicę bajtów
                                messagebytes = sl.ProcessRecivedBytes(socket);
                                //Stworzenie timestampa
                                string timestamp2 = Timestamp.generateTimestamp();
                                //Zwiększenie liczby paczek - po odebraniu paczki
                                numberOfPackages++;
                                //Wydobycie ID paczki z otrzymanej wiadomości
                                frameID = Package.extractID(messagebytes);
                                //Odpakowanie adresy nadawcy z otrzymanej wiadomości
                                sourceIp = Package.exctractSourceIP(messagebytes).ToString();
                                //Stworzenie wiadomości, która zostanie wyświetlona na ekranie - odpakowanie treści wiadomości z paczki
                                string DestinationID = null;
                                int index            = _CPCC.establishedConnections.FindIndex(x => x.Equals(sourceIp)) - 1;
                                DestinationID        = _CPCC.establishedConnections[index];
                                message2             = DestinationID + ": " + Package.extractUsableMessage(messagebytes, Package.extractUsableInfoLength(messagebytes));
                                //Pojawienie się informacji o otrzymaniu wiadomości
                                _ClientApplication.updateLogTextBox("[" + timestamp2 + "] == RECEIVED MESSAGE number " + numberOfPackages +
                                                                    " == S_ClientID: " + DestinationID + " with FrameID=" + frameID);
                                //Zauktualizowanie wiadomości w polu ReceivedMessage
                                _ClientApplication.updateReceivedMessageTextBox(message2);
                                _ClientApplication.updateReceivedMessageTextBox("\r\n");
                                message2     = null;
                                messagebytes = null;
                                frameID      = 0;
                            }
                        });
                    }
                    else

                    {
                        throw new NullReferenceException();
                    }
                }
                catch (Exception err)
                {
                    MessageBox.Show("Unable to connect to the Network Host!", "Attention!");
                    buttonConnectToCloud.Enabled = true;
                    buttonConnectToCloudClicked  = false;
                }
            }
        }