fel
le

Stream szerver - Aukciók

Készítsen kliens + szerver alkalmazást az alábbi problémára: a közösség egy vatera szerűen működő elad-vesz szervert üzemeltet. Minden tárgynak van - kod (string) - neve (string) - ára (egész szám) - felrakójának login neve (string) - vásárló login neve (string, csak ha már megvásárolta valaki)

A szerver felé fel lehet ajánlani (DD) eladásra tárgyat, amit a login-el rendelkező személyek licitálhatnak (LICIT). A megvehető tárgyak listáját (LIST) viszont login nélkül is meg lehet nézni. Ennek megfelelően az alábbi protokollt kell alkalmazni:

  • LIST: eredménye a megvehető tárgyak listája (login nélkül is működik), az alábbi sorokból áll: <nev>|<kod>|<ar>|<user> ahol a user az utoljára licitáló user neve (ha van már ilyen). A list parancs erdeménye több soros válasz.
  • LOGIN|<user>|<jelszo>: a program elfogad bármilyen usert és jelszót, mindenesetre loginolni kötelező. Eredménye vagy OK vagy ERR|<hibaüzenet>.
  • ADD|<megnevezes>|<kod>|<ar>: új termék felrakása. A kód egyedi kell legyen. Csak login után adható ki.
  • LICIT|<kod>|<ar>: csak login után adható ki, az árnak magasabbnak kell lennie az aktuális árnál.
  • BYE: ezzel jelzi a kliens hogy le kiván csatakozni. a szerver is egy BYE választ küld.

A szerver egy időben több klienssel is tartsa a kapcsolatot. A klienseknek a logint csak egyszer kell beküldeni (logout parancs nincs).

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 ConsoleApplication9
{
    class termek
    {
        public string nev;
        public string kod;
        public int akt_ar;
        public string user = null;
        //................................................................
        public termek(string nev, string kod, int akt_ar)
        {
            this.nev = nev;
            this.kod = kod;
            this.akt_ar = akt_ar;
        }
        //................................................................
    }
 
 
 
    class protokoll // kommunikacio a klienssel
    {
        // !!!!!!!!!!! STATIC !!!!!!!!!!!!!!! 1 db kozos lista !!!!!!!!!!!!
        protected static List<termek> L = new List<termek>();
 
        public StreamReader r; // amit a kliens kuld
        public StreamWriter w; // amit a kliensnek kuldunk
        public string user = null;
        //..................................................................
        public protokoll(TcpClient c)
        {
            this.r = new StreamReader( c.GetStream(), Encoding.UTF8 );
            this.w = new StreamWriter( c.GetStream(), Encoding.UTF8 );
        }
        //..................................................................
        public void startKomm() // bonyolitja a kommunikaciot a klienssel
        {
            w.WriteLine("VATERA SZERVER v0.1-beta");
            w.Flush();
            while (true)
            {
                string cmd=null;
                try
                {
                    string s = r.ReadLine(); // pl "LOGIN|zozó|titok123"
                    string[] reszek = s.Split('|');
                    cmd = reszek[0].ToUpper();
                    switch (cmd)
                    {
                        case "LOGIN":
                            cmdLogin(reszek[1], reszek[2]); // usernev,jelszo
                            break;
                        case "ADD":
                            int ar = int.Parse(reszek[3]);
                            cmdAdd(reszek[1], reszek[2], ar); // nev,kod,ar
                            break;
                        case "LIST":
                            cmdList();
                            break;
                        case "LICIT":
                            int ar2 = int.Parse( reszek[2] );
                            cmdLicit(reszek[1], ar2); // kod,ar
                            break;
                        case "BYE":
                            cmdBye();
                            break;
                        default:
                            w.WriteLine("ERR|ismeretlen parancs");
                            break;
                    }
                }
                catch (Exception e)
                {
                    w.WriteLine("ERR|{0}", e.Message);
                }
                w.Flush();
                if (cmd == "BYE") break;
            }
            Console.WriteLine("szerver befejezte a klienssel valo parbeszedet");
        }
        //..................................................................
        protected void cmdLogin(string usernev, string jelszo)
        {
            this.user = usernev;
            w.WriteLine("OK");
        }
        //..................................................................
        protected void cmdAdd(string nev, string kod, int ar)
        {
            if (user == null)
            {
                w.WriteLine("ERR|eloszor loginolj");
                return;
            }
            lock (L)
            {
                foreach (termek p in L) // !!!!!!!******************
                {
                    if (p.kod == kod)
                    {
                        w.WriteLine("ERR|a kod mar letezik");
                        return;
                    }
                }
                termek t = new termek(nev, kod, ar);
                L.Add(t); // !!!! *************
                w.WriteLine("OK");
            }
        }
        //..................................................................
        protected void cmdList()
        {
            lock(L)
            {
                w.WriteLine("OK*");
                foreach (termek p in L)
                {
                    w.WriteLine("{0}|{1}|{2}|{3}", p.nev, p.kod, p.akt_ar, p.user);
                }
                w.WriteLine("OK!");
            }
        }
        //..................................................................
        protected void cmdLicit(string kod, int ar)
        {
            if (user==null)
            {
                w.WriteLine("ERR|eloszor loginolj");
                return;
            }
 
            termek t = null;
            lock (L)
            {
                foreach (termek p in L)
                {
                    if (p.kod == kod)
                    {
                        t = p;
                        break;
                    }
                }
            }
            if (t == null) w.WriteLine("ERR|kod ismeretlen");
            else
            {
                lock (t)
                {
                    if (t.akt_ar > ar) w.WriteLine("ERR|a jelenlegi ar magasabb, tul kicsi licit");
                    else
                    {
                        t.akt_ar = ar;
                        t.user = this.user;
                        w.WriteLine("OK");
                    }
                }
            }
        }
        //..................................................................
        protected void cmdBye()
        {
            w.WriteLine("BYE");
        }
        //..................................................................
    }
 
 
 
    class Szerver
    {
        const int portSzam = 54325; // 1024 .. 65535 kozotti szam
        const string ipCim = "127.0.0.1";
        static void Main(string[] args)
        {
            Console.WriteLine("szerver indul");
            try
            {
                IPAddress ip = IPAddress.Parse(ipCim);
                TcpListener k = new TcpListener(ip, portSzam);
                k.Start();
                Console.WriteLine("A szerver sikeresen elindult {0}:{1}", ip.ToString(), portSzam);
                while (true)
                {
                    Console.WriteLine("A szerver a bejovo kapcsolatra var");
                    TcpClient client = k.AcceptTcpClient();
                    Console.WriteLine("bejovo kapcsolat megerkezett");
                    protokoll p = new protokoll(client);
                    Thread t = new Thread(p.startKomm);
                    t.Start();  // p.startKomm();
                }
            }
            catch
            {
                Console.WriteLine("A szerver nem indult el, hiba miatt!");
            }
            Console.WriteLine("-- vege, nyomj <Enter>-t");
            Console.ReadLine();
        }
    }
}
 
Hernyák Zoltán
2013-04-15 14:00:08