» »

[VC#] TCP/IP povezava med aplikacijama

[VC#] TCP/IP povezava med aplikacijama

urosz ::

imam eno vprašanje, če bi znal kdo pomagat

Izdelat moram dve aplikaciji (oz. eno, ki pa lahko igra vlogo ali strežnika ali odjemalca), ki si med seboj pošiljata sporočila. Aplikacija se zažene 2x enaka. Najprej se požene server, nato odjemalec. Ko odjemalec prvič pošlje podatke, jih strežnik sprejme. Ko jih pošlje drugič, se pa zaustavi. Kako bi naredil, da bi strežnik cel čas prejemal podatke, kdajkoli in kolikokrat koli se odjemalec pač odloči, da bo jih poslal?

TcpClient odjemalec;
TcpListener streznik;
Socket socketForClient;
NetworkStream networkStream;
StreamReader streamReader;
StreamWriter streamWriter;


Strežnik zaženem tako:
     
private void button_streznik_Click(object sender, EventArgs e)
        {

            Thread trd = new Thread(new ThreadStart(this.poslusaj));
            trd.IsBackground = true;
            trd.Start();
            

        }

private void poslusaj()
        {
            streznik = new TcpListener(IPAddress.Parse("127.0.0.1"),1111);
            streznik.Start();
            MessageBox.Show("Server: poslusam za povezavo...");
            try
            {
                while (true)
                {
                    if (streznik.Pending())
                    {
                        socketForClient = streznik.AcceptSocket();
                        MessageBox.Show("Server: povezava sprejeta!");
                        if (socketForClient.Connected)
                        {
                            networkStream = new NetworkStream(socketForClient);
                            streamReader = new StreamReader(networkStream);
                            string sprejeto = streamReader.ReadLine();
                            
                            dodajLik(sprejeto); // funkcija, ki sparsa prejeto sporočilo pač..
                            
                        }
                    }
                }
            }
            catch (Exception err)
            {
                ................
            }
        }


Odjemalec se poveže in pošlje podatke tako:
private void button_odjemalec_Click(object sender, EventArgs e)
        {

            odjemalec = new TcpClient("localhost", 1111);
            socketForClient = odjemalec.Client;
      
        }

private void poslji(string tekst)
        {
            // Pošlji strežniku
            if (odjemalec.Connected)
            {

                networkStream = odjemalec.GetStream();
                streamReader = new StreamReader(networkStream);
                streamWriter = new StreamWriter(networkStream);
                streamWriter.WriteLine(tekst);
                streamWriter.Flush();

            }
           
        }

Ericssony ::

Spodaj imaš primer izvorne kode enega mojih šolskih primerov odjemalca in strežnika.

Odjemalec:
namespace CSharpSockets.TcpEcho
{
    using System;
    using System.Net.Sockets;
    using System.Text;

    static class TcpEcho
    {
        static void Main(string[] args)
        {
            // Preveri pravilnost argumentov.
            if ((args.Length < 2) || (args.Length > 3))
            {
                Console.WriteLine("TcpEcho pošlje določeno število nizov na strežnik.\n");
                Console.WriteLine("Parametri: <strežnik> <niz> [<vrata>]\n");

                // Končaj program.
                return;
            }

            // Ime serverja ali IP naslov
            string server = args[0];

            // Če določeno uporabi argument vrat,
            // drugače uporabi privzeta vrata 7.
            int port = (args.Length == 3) ? int.Parse(args[2]) : 7;

            // Pretvori niz podatkov v zlogovno polje s kodiranjem UTF8.
            byte[] dataBuffer = Encoding.UTF8.GetBytes(args[1]);

            try
            {
                // Tipičen TCP odjemalec ima tri korake:
                // 1. Kreiranje nova instance razreda TcpClient.
                // 2. Komunicakija z uporabo podatkovnega toka.
                // 3. Konec komunikacije z uporabo metode Close() razreda TcpClient.

                // Ustvari vtičnico, ki je povezana na strežnik na določenih vratih.
                using (TcpClient client = new TcpClient(server, port))
                using (NetworkStream stream = client.GetStream())
                {
                    Console.WriteLine(
                        "\nPovezan na strežnik: {0}\nVtičnica: {1}\n",
                        server,
                        client.Client.RemoteEndPoint);

                    // Pošlji kodiran niz strežniku
                    stream.Write(dataBuffer, 0, dataBuffer.Length);
                    Console.WriteLine(
                        "Pošiljam sporočilo strežniku: {0} ({1} zlogov)...\n",
                        args[1],
                        dataBuffer.Length);

                    // Število prejetih zlogov
                    int totalBytesRecieved = 0;

                    // Število nazadnje prejetih zlogov.
                    int bytesReceived;

                    // Sprejmi nazaj niz poslan od strežnika.
                    while (totalBytesRecieved < dataBuffer.Length)
                    {
                        if ((bytesReceived = stream.Read(
                            dataBuffer,
                            totalBytesRecieved,
                            dataBuffer.Length - totalBytesRecieved)) == 0)
                        {
                            Console.WriteLine("Povezava prekinjena predčasno.\n");
                            break;
                        }

                        totalBytesRecieved += bytesReceived;
                    }

                    Console.WriteLine(
                        "Odgovor strežnika: {0} ({1} zlogov)\nPrejeto na vtičnici: {2}",
                        Encoding.UTF8.GetString(dataBuffer, 0, totalBytesRecieved),
                        totalBytesRecieved,
                        client.Client.LocalEndPoint);   
                }
            }
            catch(SocketException e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}


Strežnik:
namespace CSharpSockets.TcpEchoServer
{
    using System;
    using System.Net;
    using System.Net.Sockets;

    static class TcpEchoServer
    {
        // Velikost dohodnega medpomnilnika,
        private const int BufferSize = 32;

        static void Main(string[] args)
        {
            // Preveri pravilnost argumentov.
            if (args.Length > 1)
            {
                Console.WriteLine("Parametri: [<vrata>]");

                // Končaj program.
                return;
            }

            // Določi vrata glede na argument ali pa uporabi privzeta.
            int port = (args.Length == 1) ? int.Parse(args[0]) : 7;

            // Dohodni medpomnilnik.
            byte[] receiveBuffer = new byte[BufferSize];

            // Tipični koraki za TCP strežnik:
            // 1. Kreiramo novo instanco razreda TcpListener.
            // 2. Ponavljajoče:
            //    - kličemo metodo AcceptTcpClient() razreda TcpClient,
            //      da dobimo naslednjo prihajajočo povezavo odjemalca.
            //    - komuniciramo z odjemalcem z medoti Read() in Write()
            //      razreda NetworkStream.
            //    - končamo komunikacijo s vtičnico odjemalca z uporabo
            //      metode Close() razredov NetworkStream in TcpClient.
            
            // Nova instanca objekta TcpListener, ki sprejme povezavo od klijenta.
            TcpListener listener = new TcpListener(IPAddress.Any, port);
            listener.Start();
            
            // Sprejmi in obdelaj povezave v neskončni zanki.
            while (true)
            {
                try
                {
                    // Povezava do klijenta
                    using (TcpClient client = listener.AcceptTcpClient())
                    using (NetworkStream netStream = client.GetStream())
                    {
                        Console.Write("Upravljanje z odjemalcem - ");

                        // Število vrnjenih zlogov.
                        int totalBytesEchoed = 0;
                        
                        // Število prejetih zlogov.
                        int bytesReceived;

                        // Prejemaj dokler odjemalec ne prekine povezave z vrnjeno vrednostjo 0
                        while ((bytesReceived = netStream.Read(receiveBuffer, 0, receiveBuffer.Length)) > 0)
                        {
                            netStream.Write(receiveBuffer, 0, bytesReceived);

                            totalBytesEchoed += bytesReceived;
                        }

                        Console.WriteLine("vrnjeno {0} zlogov.", totalBytesEchoed);
                    }
                }
                catch (SocketException e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
    }
}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Socket Server

Oddelek: Programiranje
142427 (1620) fx
»

C# Branje iz datoteke

Oddelek: Programiranje
5974 (783) boogie_xlr
»

[C#] Client -> Server komunikacija dela, kako je pa z Server -> Client?

Oddelek: Programiranje
51270 (1136) Mitja Bonča
»

[Visual C#] zaradi while zanke se ne pokaže okno

Oddelek: Programiranje
8988 (865) Fresh-Grass
»

c# base class, derived class, inheritance problem

Oddelek: Programiranje
91391 (1270) Vapo1

Več podobnih tem