예제 #1
0
        // Metoden Lyssna lyssnar på vad klienten vill och skickar datan till han
        public async void Lyssna(Klient k)
        {
            try
            {
                // Tar emot enum DataType från användaren
                byte[] recieveData = new byte[1000];
                await k.klient.GetStream().ReadAsync(recieveData, 0, recieveData.Length);

                int typeNumber = BitConverter.ToInt32(recieveData, 0);


                DataType type = (DataType)typeNumber;
                lbx_listan.Items.Add(type);
                //_________________________________________________

                // Metoden i klassen DataBase som motsvarar DataType anropas och Datan skickas till användaren
                // Om det händer ett fel så skickas felmedelandet istället av datan
                if (type == DataType.SetNewOrd)
                {
                    int orderNew = DataBase.SetNewOrd(k);

                    sendInt(k.klient, (int)k.fel);

                    if (k.fel == Fel.NO)
                    {
                        sendInt(k.klient, orderNew);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.GetDataFromOrder)
                {
                    sendInt(k.klient, 3);
                    int ordNr = GetInt(k.klient);



                    string[] OrderData = DataBase.GetDataFromOrder(ordNr, k);

                    sendInt(k.klient, (int)k.fel);
                    GetInt(k.klient);
                    if (k.fel == Fel.NO)
                    {
                        string DataString = OrderData[0];

                        for (int i = 1; i < OrderData.Length; i++)
                        {
                            // Fältet omvandlas till en string och delas med en # imellan så att klienten kan dela den och omvandla den till ett fält igen
                            DataString = DataString + "#" + OrderData[i];
                        }

                        sendString(k.klient, DataString);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.GetOrderCount)
                {
                    int order = DataBase.GetOrderCount(k);

                    sendInt(k.klient, (int)k.fel);

                    GetInt(k.klient);
                    if (k.fel == Fel.NO)
                    {
                        sendInt(k.klient, order);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }

                else if (type == DataType.GetPlaces)
                {
                    string[] places = DataBase.GetPlaces(k);

                    sendInt(k.klient, (int)k.fel);
                    GetInt(k.klient);
                    if (k.fel == Fel.NO)
                    {
                        if (places.Length != 0)
                        {
                            string DataString = places[0];

                            for (int i = 1; i < places.Length; i++)
                            {
                                // Fältet omvandlas till en string och delas med en # imellan så att klienten kan dela den och omvandla den till ett fält igen
                                DataString = DataString + "#" + places[i];
                            }

                            sendString(k.klient, DataString);
                        }
                        else
                        {
                            sendString(k.klient, "NO DATA");
                        }
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.GetStudents)
                {
                    string[,] students = DataBase.GetStudents(k);

                    sendInt(k.klient, (int)k.fel);
                    GetInt(k.klient);
                    if (k.fel == Fel.NO)
                    {
                        string DataString = "";

                        for (int i = 0; i < students.GetLength(0); i++)
                        {
                            DataString = DataString + students[i, 0];
                            // Dubbelfältet omvandlas till en string och delas med en ? och # imellan så att klienten kan dela den och omvandla den till ett fält igen
                            for (int t = 1; t < students.GetLength(1); t++)
                            {
                                DataString = DataString + "?" + students[i, t];
                            }
                            if (i != students.GetLength(0) - 1)
                            {
                                DataString = DataString + "#";
                            }
                        }

                        if (DataString.Equals(""))
                        {
                            DataString = "NO DATA";
                        }
                        sendString(k.klient, DataString);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.GetAllOrder)
                {
                    string[,] Order = DataBase.GetAllOrder(k);

                    sendInt(k.klient, (int)k.fel);
                    if (k.fel == Fel.NO)
                    {
                        string DataString = "";

                        for (int i = 0; i < Order.GetLength(0); i++)
                        {
                            DataString = DataString + Order[i, 0];
                            for (int t = 1; t < Order.GetLength(1); t++)
                            {
                                // Dubbelfältet omvandlas till en string och delas med en ? och # imellan så att klienten kan dela den och omvandla den till ett fält igen
                                DataString = DataString + "?" + Order[i, t];
                            }
                            if (i != Order.GetLength(0) - 1)
                            {
                                DataString = DataString + "#";
                            }
                        }
                        if (DataString.Equals(""))
                        {
                            DataString = "NO DATA";
                        }

                        sendString(k.klient, DataString);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.GetStudentOrder)
                {
                    string studentName  = GetString(k.klient);
                    int[]  studentOrder = DataBase.GetStudentOrder(studentName, k);

                    sendInt(k.klient, (int)k.fel);

                    if (k.fel == Fel.NO)
                    {
                        string DataString = studentOrder[0].ToString();

                        for (int i = 1; i < studentOrder.Length; i++)
                        {
                            // Fältet omvandlas till en string och delas med en # imellan så att klienten kan dela den och omvandla den till ett fält igen
                            DataString = DataString + '#' + studentOrder[i];
                        }
                        sendString(k.klient, DataString);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.GetPlaceOrder)
                {
                    string PlaceName  = GetString(k.klient);
                    int[]  PlaceOrder = DataBase.GetPlaceOrder(PlaceName, k);

                    sendInt(k.klient, (int)k.fel);

                    if (k.fel == Fel.NO)
                    {
                        string DataString = PlaceOrder[0].ToString();

                        for (int i = 1; i < PlaceOrder.Length; i++)
                        {
                            // Fältet omvandlas till en string och delas med en # imellan så att klienten kan dela den och omvandla den till ett fält igen
                            DataString = DataString + '#' + PlaceOrder[i];
                        }
                        sendString(k.klient, DataString);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                    Thread.Sleep(3);
                }
                else if (type == DataType.SetDataToOrder)
                {
                    // Servern får ett fält i form av en string
                    int ordNr = GetInt(k.klient);
                    sendInt(k.klient, 100);
                    string DataString = GetString(k.klient);

                    Thread.Sleep(3);

                    // Servern delar den med hjälp av tecknet # som ligger imellan varje string i fältet
                    string[] Data = DataString.Split('#');

                    DataBase.SetDataToOrder(ordNr, Data, k);

                    sendInt(k.klient, (int)k.fel);
                    if (k.fel == Fel.YES)
                    {
                        sendString(k.klient, k.FelMedelande);
                    }

                    Thread.Sleep(3);
                }
                else if (type == DataType.AddStudent)
                {
                    string StudentName = GetString(k.klient);
                    Thread.Sleep(3);
                    string Password = GetString(k.klient);

                    if (Password.Equals("NO DATA"))
                    {
                        Password = "";
                    }
                    DataBase.AddStudent(StudentName, Password, k);

                    sendInt(k.klient, (int)k.fel);

                    if (k.fel == Fel.YES)
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.AddPlace)
                {
                    string place = GetString(k.klient);

                    DataBase.AddPlace(place, k);

                    sendInt(k.klient, (int)k.fel);

                    if (k.fel == Fel.YES)
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.DeletePlace)
                {
                    string place = GetString(k.klient);

                    DataBase.DeletePlace(place, k);

                    sendInt(k.klient, (int)k.fel);
                    if (k.fel == Fel.YES)
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                    Thread.Sleep(3);
                }
                else if (type == DataType.DeleteOrder)
                {
                    int ordNr = GetInt(k.klient);

                    DataBase.DeleteOrder(ordNr, k);

                    sendInt(k.klient, (int)k.fel);
                    if (k.fel == Fel.YES)
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                    Thread.Sleep(3);
                }
                else if (type == DataType.DeleteStudent)
                {
                    sendInt(k.klient, 100);
                    string StudentName = GetString(k.klient);

                    DataBase.DeleteStudent(StudentName, k);

                    sendInt(k.klient, (int)k.fel);
                    if (k.fel == Fel.YES)
                    {
                        GetInt(k.klient);
                        sendString(k.klient, k.FelMedelande);
                    }
                    Thread.Sleep(3);
                }

                else if (type == DataType.GetStudent)
                {
                    string ElevNamn = GetString(k.klient);

                    string[] StudentData = DataBase.GetStudent(ElevNamn, k);
                    sendInt(k.klient, (int)k.fel);

                    if (k.fel == Fel.NO)
                    {
                        string DataString = "NO DATA";
                        if (StudentData.Length != 1)
                        {
                            DataString = StudentData[0] + "#" + StudentData[1];
                        }
                        sendString(k.klient, DataString);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                    Thread.Sleep(3);
                }
                else if (type == DataType.GetPlace)
                {
                    string avdelning = GetString(k.klient);

                    string DataString = DataBase.GetPlace(avdelning, k);

                    sendInt(k.klient, (int)k.fel);
                    if (k.fel == Fel.NO)
                    {
                        sendString(k.klient, DataString);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.OrderExist)
                {
                    sendInt(k.klient, 3);
                    int OrderNr = GetInt(k.klient);

                    bool exist = DataBase.OrderExist(OrderNr, k);

                    sendInt(k.klient, (int)k.fel);
                    GetInt(k.klient);
                    if (k.fel == Fel.NO)
                    {
                        sendBool(k.klient, exist);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                // SetBeskrivning finns inte i klassen DataBase för att beskrivningen ligger inte i databasen utan i en text fil
                // Metoden finns för att användaren ska spara beskrivningen
                else if (type == DataType.SetBeskrivning)
                {
                    // Tar emot texten som användare vill spara
                    string text = GetString(k.klient);
                    if (text.Equals("NO DATA"))
                    {
                        text = "";
                    }
                    // Serven tar ordernummret från klienten
                    sendInt(k.klient, 100);
                    string OrderNr = GetString(k.klient);

                    Thread.Sleep(3);
                    // Servern plockar textfilen med hjälp av ordernummer och sätter texten i den
                    FileStream   fs = new FileStream("Data/" + OrderNr + ".txt", FileMode.Create, FileAccess.Write);
                    StreamWriter sw = new StreamWriter(fs);
                    sw.Write(text);
                    sw.Close();
                    fs.Close();
                }
                // GetBeskrivning finns inte i klassen DataBase för att beskrivningen ligger inte i databasen utan i en text fil
                // Metoden finns för att användaren ska ta beskrivningen från servern
                else if (type == DataType.GetBeskrivning)
                {
                    sendInt(k.klient, 3);

                    // Serven tar ordernummret från klienten
                    string OrderNr = GetString(k.klient);
                    string text;
                    try
                    {
                        // Servern plockar textfilen med hjälp av ordernummer och sätter texten i den
                        FileStream   fs = new FileStream("Data/" + OrderNr + ".txt", FileMode.Open, FileAccess.Read);
                        StreamReader sr = new StreamReader(fs);

                        // Den läser texten och skickar den till klienten
                        text = sr.ReadToEnd();
                        sr.Close();
                        fs.Close();
                    }
                    catch (Exception)
                    {
                        text = "";
                    }

                    Thread.Sleep(3);
                    if (text.Equals(""))
                    {
                        text = "NO DATA";
                    }
                    sendString(k.klient, text);
                }
                // GetImage finns inte i klassen DataBase för att bilden ligger inte i databasen utan i en bild fil
                // Metoden finns för att användaren ska ta bilden från servern
                else if (type == DataType.GetImage)
                {
                    sendInt(k.klient, 3);
                    // Ordernummret tas från klienten
                    int OrderNr = GetInt(k.klient);
                    sendInt(k.klient, 3);

                    // Servern tar bildformatet från klienten för att den ska veta vilken bild den ska plocka
                    string Format = GetString(k.klient);

                    // Den plockar bilden
                    Image img = Image.FromFile("Data/" + OrderNr + "." + Format);

                    MemoryStream ms = new MemoryStream();

                    // Bilden omvandlas till en stream
                    img.Save(ms, img.RawFormat);

                    // Stream omvandlas till en byte fält för att skickas till klienten
                    var ImgByte = ms.ToArray();
                    img.Dispose();

                    // Storleken på bilden skickas till klienten
                    sendInt(k.klient, ImgByte.Length);
                    Thread.Sleep(30);
                    // byte fältet med bilden skickas sen till användaren
                    k.klient.GetStream().Write(ImgByte, 0, ImgByte.Length);
                    Thread.Sleep(30);
                }
                else if (type == DataType.SetImage)
                {
                    int OrderNr = GetInt(k.klient);

                    sendInt(k.klient, 3);

                    string Format = GetString(k.klient);

                    sendInt(k.klient, 3);

                    int Lenght = GetInt(k.klient);

                    sendInt(k.klient, 3);
                    try
                    {
                        byte[] ImgByte = new byte[Lenght * 2];

                        k.klient.GetStream().Read(ImgByte, 0, ImgByte.Length);


                        MemoryStream ms = new MemoryStream(ImgByte);


                        Image img = Image.FromStream(ms);

                        if (File.Exists("Data/" + OrderNr + "." + Format))
                        {
                            File.Delete("Data/" + OrderNr + "." + Format);
                        }
                        if (Format.Equals("jpg"))
                        {
                            img.Save("Data/" + OrderNr + "." + Format, ImageFormat.Jpeg);
                        }
                        else if (Format.Equals("png"))
                        {
                            img.Save("Data/" + OrderNr + "." + Format, ImageFormat.Png);
                        }
                        k.fel = Fel.NO;
                        sendInt(k.klient, (int)k.fel);
                    }
                    catch (ExternalException)
                    {
                        k.fel = Fel.NO;
                        sendInt(k.klient, (int)k.fel);
                    }
                    catch (Exception error)
                    {
                        k.fel          = Fel.YES;
                        k.FelMedelande = error.ToString();
                        sendInt(k.klient, (int)k.fel);
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.Check)
                {
                    string StudentName = GetString(k.klient);
                    sendString(k.klient, StudentName);
                    string Password = GetString(k.klient);

                    bool Finns = DataBase.Check(StudentName, Password, k);

                    sendInt(k.klient, (int)k.fel);

                    if (k.fel == Fel.NO)
                    {
                        sendBool(k.klient, Finns);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                else if (type == DataType.GetLastOrder)
                {
                    int order = DataBase.GetLastOrder(k);

                    sendInt(k.klient, (int)k.fel);

                    GetInt(k.klient);
                    if (k.fel == Fel.NO)
                    {
                        sendInt(k.klient, order);
                    }
                    else
                    {
                        sendString(k.klient, k.FelMedelande);
                    }
                }
                lbx_listan.Items.Add((int)type);
                Lyssna(k);
            }
            catch (Exception)
            {
                klienter.Remove(k);
            }
        }