fel
le

Kis matematika

Egy matematika szerveren három funkciót kell implementálni:

  • ADD|<a>|<b>: két szám összegét számolja ki,
  • PRIMEK|< N >: prímszámok állít elő az adott N értékig.
  • BYE: kilépés

Készítsünk hozzá klienst, és szervert.

Megoldás (kliens)

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

namespace kliens
{
    class Program
    {
        static void Main(string[] args)
        {
            //Létrehozok egy ilyen órai klienst
            OraiKliens client = new OraiKliens("127.0.0.1", 9766);
            //Amennyiben sikerült csatlakozni, kiírom és megyünk tovább, amennyiben nem, akkor kilép a mainből.
            if (client.Connect())
            {
                Console.WriteLine("Kapcsolódás sikerült!");
            }
            else
            {
                Console.WriteLine("Nem sikerült csatlakozni! A kilépéshez nyomjon entert...");
                Console.ReadLine();
                return;
            }
            //Itt is nyitok folyamot.
            StreamReader r = new StreamReader(client.Client.GetStream(), Encoding.Default);
            StreamWriter w = new StreamWriter(client.Client.GetStream(), Encoding.Default);
            //Kiírom a szerver üdvözlőüzenetét.
            string hello = r.ReadLine();
            Console.WriteLine("Szerver mondja: [{0}]", hello);
            //Ez a while csinálja majd azt, hogy fogadom a sorokat, amíg vissza nem jelez, hogy kilép.
            bool vege = false;
            while (vege == false)
            {
                //Beolvassa amit beírtunk, majd küldi a szervernek.
                string cmd = Console.ReadLine();
                w.WriteLine(cmd);
                w.Flush();
                //Ltárolja a választ.
                string valasz = r.ReadLine();
                //Amennyiben a válasz az, hogy BYE, a szerver kikapcsolt, így mi is kikapcsolunk.
                if (valasz == "BYE") vege = true;
                //Amennyiben az üzenet elején @ van, az arra utal, hogy nem egy soros választ fogunk kapni, majdan ezt addig dolgozzuk fel, amíg
                //*-ot nem kapunk
                if (valasz == "@")
                {
                    while (true)
                    {
                        valasz = r.ReadLine();
                        if (valasz == "*")
                            break;
                        Console.WriteLine(valasz);
                    }
                   
                }
                //Amennyiben 1 soros a válaszom, kiírom és készen is vagyok.
                else
                {
                    Console.WriteLine("Szerver válasza: [{0}]", valasz);
                }
            }
            //Amikor végeztem bezárom a streamet(kapcsolatot?).
            client.Client.Close();
        }
    }

    class OraiKliens
    {
        /// <summary>
        /// A szerver portja.
        /// </summary>
        protected int serverPort;
        /// <summary>
        /// Magya a kliensem.
        /// </summary>
        protected TcpClient client;
        /// <summary>
        /// A szerver IP-je.
        /// </summary>
        protected IPAddress serverIp;

        public IPAddress ServerIP
        {
            get { return this.serverIp; }
        }

        public TcpClient Client
        {
            get { return this.client; }
        }

        public int ServerPort
        {
            get { return this.serverPort; }
        }
        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="IP">A szerver IP-je.</param>
        /// <param name="port">A Szerver portja.</param>
        public OraiKliens(string IP,int port)
        {
            this.serverPort = port;
            this.serverIp = IPAddress.Parse(IP);
            client = new TcpClient();
        }
        /// <summary>
        /// Ezzel a függvénnyel kapcsolódunk a szerverhez. 10-szer próbál csatlakozni.
        /// </summary>
        /// <returns>Igaz, amennyiben sikerült kapcsolódjunk.</returns>
        public bool Connect()
        {
            for (int i = 0; i < 10; i++)
            {
                try
                {
                    Console.WriteLine("{0}. connect:", i + 1);
                    client.Connect(serverIp, serverPort);
                    Console.WriteLine("Sikeres! {0}:{1}", serverIp, serverPort);
                    break;
                }
                catch
                {
                    System.Threading.Thread.Sleep(1000);
                }
            }
            if (client.Connected == false) return false;
            else return true;
        }
    }

   
}
 

Megoldás (szerver)

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

namespace szerver
{
    class Program
    {
        static void Main(string[] args)
        {
            //Csinálok egy ilyen új OraiSzervert, majd beállítom, ahogy kell. AZ első paramétere ugye azon IP, ahol portot akarok nyitni, a második pedig a
            // port, amit nyitni
            OraiSzerver serv1 = new OraiSzerver("127.0.0.1",9766);
            //Elindítom a szervert
            serv1.StartServer();
            Console.WriteLine("Szerver elindítva!");
            //Ezzel a paranccsal várok addig, amíg nem csatlakozik valaki hozzám.
            serv1.Kliens=serv1.Server.AcceptTcpClient();
            Console.WriteLine("Kliens csatlakozott!");
            //=============================================
            //Stream-eket csinálok.
            StreamReader r = new StreamReader(serv1.Kliens.GetStream(),Encoding.Default);
            StreamWriter w = new StreamWriter(serv1.Kliens.GetStream(),Encoding.Default);
            w.WriteLine("Szerver teszt");
            w.Flush();
            //=============================================

            bool vege = false;
            //Ezzel a csiklussal várok. Ha kapok egy adott parancsot, azt végrehajtom.
            while (vege == false)
            {
                string cmd = r.ReadLine();
                string[] reszek = cmd.Split('|');
                switch (reszek[0])
                {
                        //Értelem szerűen feldarabolom a kapott adatot, majd a két számot összeadom, az eredményt visszaküldöm a kliensnek.
                    case "ADD":
                        int a = int.Parse(reszek[1]);
                        int b = int.Parse(reszek[2]);
                        int x = a + b;
                        w.WriteLine(x);
                        w.Flush();
                        break;
                        //Amennyiben ezt a parancsot kapom, meghívom a PrimekGen-t, ami adott N-ig kiírja a prímeket.
                    case "PRIMEK":
                        int n = int.Parse(reszek[1]);
                        Feladatok.PrimekGen(w,n);
                        w.WriteLine("*");
                        w.Flush();
                        break;
                        //Amikor ezt a parancsot kapom, akkor kilépek.
                    case "BYE":
                        vege = true;
                        w.WriteLine("BYE");
                        w.Flush();
                        break;
                    default:
                        w.WriteLine("Nem jó a parancs!");
                        w.Flush();
                        break;
                }
            }
            //Miután befejeztem a munkát, bezárom a folyamot (kapcsolatot?).
            r.Close();

        }
    }

    class OraiSzerver
    {
        //Mezők:
        /// <summary>
        /// Az a port, amit a szerver induláskor nyitunk
        /// </summary>
        protected int _port;
        /// <summary>
        /// Az az IP, aminy portot nyitottunk, és a szerver IP-je lesz.
        /// </summary>
        protected IPAddress _thisIP;
        /// <summary>
        /// Maga a szerver, amit indítottunk.
        /// </summary>
        protected TcpListener _server;
        /// <summary>
        /// Kliens, aki csatlakozott hozzánk.
        /// </summary>
        protected TcpClient _kliens;

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

        public TcpClient Kliens
        {
            get { return _kliens; }
            set { this._kliens = value; }
        }

        /// <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)
        {
            this._port = port;
            this._thisIP = IPAddress.Parse(ipAddr);
        }
        //Metódusok:
        /// <summary>
        /// Elindítja a szervert.
        /// </summary>
        public void StartServer()
        {
           
            _server = new TcpListener(_thisIP, _port);
            _server.Start();
        }

    }

    class Feladatok
    {
        /// <summary>
        /// Legenerálja adott N értékig az összes prímet, majd az adott StreamWriter-re kiírja azt.
        /// </summary>
        /// <param name="w">Az a Stream, amire írni szeretnénk.</param>
        /// <param name="n">Azon érték, ameddig kiszámolja a prímeket.</param>
        static public void PrimekGen(StreamWriter w, int n)
        {
            //@azt jelenti, hogy több soros kiírás várható. Jelentősége a kliensünknél van.
            w.WriteLine("@");
            w.Flush();
            for (int i = 2; i <= n; i++)
            {
                bool prim = true;
                for (int j = 2; j <= i / 2; j++)
                {
                    if (i % j == 0)
                    {
                        prim = false;
                        break;
                    }
                }
                if (prim == true)
                {
                    w.WriteLine(i);
                    w.Flush();
                }
            }
        }
    }
}
 
Hernyák Zoltán
2013-04-15 14:00:09