fel
le

Film kölcsönzés

Készítsünk el egy kliens-szerver alkalmazást az alábbi problémára:

  • a szervernek kezelnie kell felhasználókat <User>,
  • CD/DVD-k egy listáját,
  • a felhasználók dvd filmeket kölcsönözhetnek.

A felhasználók adatai:

  • név <string>
  • jelszó <string>

A felhasználók adatait egy userek.txt file tartalmazza. A foleban egy felhasználó adatai egy sorban vannak leírva, <nev>| alakban. A szerver induláskor olvassa fel az adatokat.

A DVD filmek adatait egy lista.txt file tartalmazza, egy dvd film adatai egy sorban, | jellel elválasztott formában. A szerver induláskor olvassa fel az adatbázis tartalmát.

A szervernek támogatni kell az alábbi funkciókat:

  • HELP: kilistázza az elérhető parancsok neveit és funkcióit
  • LISTA : filmek listázása
  • LOGIN|<nev>|<pass>: Bejelentkezteti az adott felhasználót.
  • LOGOUT: kijelentkezteti az adott klienst a szerverrõl
  • KOLCSONZES|<id>: A választott id-jû film kikölcsönzése <értelemszerűen ellenőrízni kell, hogy a film nincs jelenleg kikölcsönözve, és csak login után adhatjuk ki.
  • VISSZAVISZ|<id>: Jelezük, hogy a választott id-jû filmet visszavisszük <ellenőrízni kell hogy az adott film nálunk van-e kölcsönözve, login után>
  • ADDUSER|<acc>|<pass>: Új felhasználó felvétele, csak admin teheti meg
  • USERDEL|<acc>: Felhasználó törlése, csak admin teheti meg
  • USERLIST: Userek listázása, nevek és jelszavak, csak admin teheti meg
  • ONLINEUSERLIST: Online userek listázása. Kiírja kik vannak aktuálisan bejelentkezve a szerverre <login utáni állapot>.
  • EXIT: kommunikáció befejezése, kliens kilép.

A szerver forráskódja

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace KolcsonzoSzerver
{
    class Program
    {
        public static Thread t;
        static void Main(string[] args)
        {
            CdListaKezeles cl = new CdListaKezeles("lista.txt");
            OraiSzerver serv = new OraiSzerver("192.168.1.101", 80, cl);
            serv.StartServer();
            Console.WriteLine("Szerver elindítva");
            Console.WriteLine("Parancsok listázása a HELP paranccsal!");
            t = new Thread(serv.KliensekreVar);
            t.Start();
            bool vege = false;
            string s;
            string[] reszek;
            while (!vege)
            {
                s=Console.ReadLine();
                reszek = s.Split('|');
                switch (reszek[0].ToUpper())
                {
                    case "HELP":
                        foreach (var item in serv.SzerverParancsok)
                        {
                            Console.WriteLine(item);
                        }
                        break;
                    case "VISSZAHOZTA":
                        int id = int.Parse(reszek[1]);
                        if (serv.LetezikEId(id))
                        {
                            if (serv.Visszahozta(id))
                            {
                                Console.WriteLine("Visszahozva a(z) {0}!",serv.FilmIdAlapjan(id));
                            }
                            else
                            {
                                Console.WriteLine("A film bent van, így nem lehet visszahozn! :)");
                            }
                        }
                        else
                            Console.WriteLine("Nincs ilyen id!");
                        break;
                    case "LISTA":
                        List<string> lista = serv.ListaLeker();
                            Console.WriteLine("ID\tCím\t\tÁr\tKölcsönözve van-e\tKinél");
                            foreach (var item in lista)
                            {
                                Console.WriteLine(item);
                            }
                        break;
                    case "ADDUSER":
                        if (serv.FelhasznaloFelvetele(reszek[1], reszek[2]))
                        {
                            Console.WriteLine("User felvéve!");
                        }
                        else
                        {
                            Console.WriteLine("Ez a user már létezik!");
                        }
                        break;
                    case "USERDEL":
                        if (serv.FelhasznaloTorlese(reszek[1]))
                        {
                            Console.WriteLine("User törölve!");
                        }
                        else
                        {
                            Console.WriteLine("Nincs ilyen felhasználó!");
                        }
                        break;
                    case "USERLIST":
                        foreach (var item in serv.Felhasznalok)
                        {
                            Console.Write(item.Acc+" ");
                        }
                        Console.WriteLine();
                        break;
                    case "ONLINEUSERLIST":
                        try
                        {
                            if (serv.OnlineKliensek.Count == 0)
                            {
                                Console.WriteLine("Nincs online kliens!");
                                continue;
                            }
                            foreach (var item in serv.OnlineKliensek)
                            {
                                Console.WriteLine(item.User.Acc + " ");
                            }
                        }
                        catch (NullReferenceException e)
                        {
                            Console.WriteLine("Nincs online user!");
                        }
                        catch (Exception e)
                        {
                            throw;
                        }
                        Console.WriteLine();
                        break;
                    case "EXIT":
                        vege = true;
                        serv.SzerverLeall();
                        t.Abort();
                        break;
                    default:
                        Console.WriteLine("Ismeretlen parancs!");
                        break;
                }

            }
            //Console.ReadLine();

           
        }
        public static void Kiir(string szoveg)
        {
            Console.WriteLine(szoveg);
        }
       

       
    }

    class OraiSzerver
    {
        //Mezõk:
        /// <summary>
        /// Az a port, amit a szerver induláskor nyitunk
        /// </summary>
        protected int _port;

        public int Port
        {
            get { return _port; }
            set { _port = value; }
        }
        /// <summary>
        /// Az az IP, aminy portot nyitottunk, és a szerver IP-je lesz.
        /// </summary>
        protected IPAddress _thisIP;

        public IPAddress ThisIP
        {
            get { return _thisIP; }
            set { _thisIP = value; }
        }
        /// <summary>
        /// Maga a szerver, amit indítottunk.
        /// </summary>
        protected TcpListener _server;
        /// <summary>
        /// Kliens, aki csatlakozott hozzánk.
        /// </summary>

        protected List<Thread> szallista = new List<Thread>();

        protected List<User> felhasznalok;

        public List<User> Felhasznalok
        {
            get { return felhasznalok; }
        }

        protected CdListaKezeles _cdlista;

        protected List<string> parancsok;

        public List<string> Parancsok
        {
            get { return parancsok; }
        }

        protected List<string> szerverParancsok;

        public List<string> SzerverParancsok
        {
            get { return szerverParancsok; }
            set { szerverParancsok = value; }
        }

        //Propertyk:
        public TcpListener Server
        {
            get { return _server; }
        }

        protected List<KolcsonzoKliens> onlineKliensek;

        public List<KolcsonzoKliens> OnlineKliensek
        {
            get { return onlineKliensek; }
        }

        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="ipAddr">Az az IP cím, amelyen portot szeretnénk nyitni</param>
        /// <param name="port">A megnyitandó port száma</param>
        public OraiSzerver(string ipAddr, int port,CdListaKezeles cdlista )
        {
            this._port = port;
            this._thisIP = IPAddress.Parse(ipAddr);
            this._cdlista = cdlista;
            this.parancsok = new List<string>() { "LISTA - Filmek listázása",
                "KOLCSONZES|(id) - A választott id-jû film kikölcsönzése",
                "VISSZAVISZ|(id) - Jelezük, hogy a választott id-jû filmet visszavisszük.",
                "LOGIN|(nev)|(pass) - Bejelentkezteti az adott felhasználót",
                "LOGOUT - kijelentkezteti az adott klienst a szerverrõl"
            };
            this.felhasznalok=  new List<User>();
            felhasznalokatBeolvas("userek.txt");
            this.onlineKliensek = new List<KolcsonzoKliens>();
            this.szerverParancsok = new List<string>() {
                "VISSZAHOZTA|(id) - Az adott id-jû filmet visszahozták",
                "ADDUSER|(acc)|(pass) - Új felhasználó felvétele",
                "USERDEL|(acc) - Felhasználó törlése",
                "USERLIST - Userek listázása.",
                "ONLINEUSERLIST - Online userek listázása.",
                "LISTA - Filmek listázása."
            };
        }
        //Metódusok:
        /// <summary>
        /// Elindítja a szervert.
        /// </summary>
        public void StartServer()
        {

            _server = new TcpListener(_thisIP, _port);
            _server.Start();
        }

        public bool UserLetezikE(string acc)
        {
            foreach (var item in felhasznalok)
            {
                if (item.Acc == acc)
                    return true;

            }
            return false;
        }

        public bool  Visszahozta(int id)
        {
            return _cdlista.Visszahoz(id);
        }

        protected User userLeker(string acc)
        {
            foreach (var item in felhasznalok)
            {
                if (item.Acc == acc)
                    return item;
            }
            return null;
        }

        public bool VisszahozasiKerelem(int id, string acc)
        {
            if (_cdlista.BentVanE(id))
            {
                Thread t = new Thread(delegate(object unused) { VisszahozMegerosítesreVar(id, acc); });
                t.Start();
                return true;
            }
            return false;
        }

        protected void VisszahozMegerosítesreVar(int id, string acc)
        {
            lock (typeof(Console))
            {
                Program.Kiir(acc + " vissza szeretné hozni a(z)" + _cdlista.FilmIdAlapjan(id) + " c. fimet! Visszahozta? (I, ha igen)");
                string s;
                bool ve = false;
                while (!ve)
                {
                    s = Console.ReadLine();
                    if (s.ToUpper() == "I")
                    {
                        Visszahozta(id);
                        Console.WriteLine("Kérés rögzítve!");
                        ve = false;

                    }
                    else
                    {
                        Program.Kiir("Helytelen!");
                    }
                }
            }
        }

        protected void userekKiirFileba(string filenev)
        {
            StreamWriter wr = new StreamWriter(filenev, false);
            foreach (var item in felhasznalok)
            {
                wr.WriteLine(item.Acc+"|"+item.Pass);

            }
            wr.Flush();
            wr.Close();
        }

        public bool FelhasznaloFelvetele(string acc,string pass)
        {
            if (!UserLetezikE(acc))
            {
                User u = new User(acc, pass);
                felhasznalok.Add(u);
                userekKiirFileba("userek.txt");
                return true;
            }
            return false;
        }

        public bool FelhasznaloTorlese(string acc)
        {
            if (UserLetezikE(acc))
            {
                User u=null;
                foreach (var item in felhasznalok)
                {
                    if (item.Acc == acc)
                        u = item;
                }
                felhasznalok.Remove(u);
                userekKiirFileba("userek.txt");
                return true;
            }
            return false;
        }



        public User Login(string acc, string pass)
        {
            if (beVanLogolva(acc))
                throw new UserOnlineException();
            if(UserLetezikE(acc))
            {
                User U = userLeker(acc);
                if(U.Pass==pass)
                {
                    return U;
                }
               
            }
            return null;
        }

        public void KliensekreVar()
        {
            while (true)
            {
                var tx = Server.AcceptTcpClient();
                Console.WriteLine("Kliens csatlakozott!");
                KolcsonzoKliens kc = new KolcsonzoKliens(this, tx);
                onlineKliensek.Add(kc);
                Thread t = new Thread(kc.Kommunikal);
                szallista.Add(t);
                t.Start();
            }
        }

        public void SzerverLeall()
        {
            foreach (var item in onlineKliensek)
            {
                item.Kliens.Close();
            }
            foreach (var item in szallista)
            {
                item.Abort();
            }
        }

        public bool beVanLogolva(string acc)
        {
            try
            {
                foreach (var item in onlineKliensek)
                {
                    if (item.User.Acc == acc)
                        return true;
                }
            }
            catch (NullReferenceException e)
            {
                return false;
            }
            catch (Exception e)
            {
                throw e;
            }
            return false;
        }
        public void LogOut(KolcsonzoKliens kc)
        {
            onlineKliensek.Remove(kc);
            lock (typeof(Program))
            {
                Program.Kiir("Kliens kilépett!");
            }
        }

        public bool Lefoglal
Hernyák Zoltán
2013-04-15 14:00:10