×

Výstrahy

JUser: :_load: Nemôžem načítať používateľa s ID: 75
štvrtok, 08 marec 2012 12:32 Written by 10540 times
Rate this item
(3 votes)

C# - UDP client server

Ukážeme si ako spraviť jednoduchú komunikáciu v UDP client-server.
User Datagram Protocol (UDP) je tzv. nespoľahlivý protokol. UDP protokol prenáša datagramy medzi počítačmi v sieti, ale na rozdiel od TCP nezaručuje, že prenášaný paket sa nestratí, že sa nezmení poradie paketov, ani že sa niektorý paket nedoručí viackrát.

Pred kompiláciou zdrojového kódu treba zmeniť IP adresu v oboch programoch.V kóde je IP servera nastavená ako localhost 127.0.0.1 a port 10123. Po spustení servera začne server načúvať na nastavenom porte. Po spustení klienta sa klient pripojí a odošle serveru našu správu.Server po obdržaní správy ju zobrazí a pošle potvrdenie, ktoré dostane klient. Klient môže byt spustený na rovnakom pocítaci ako server alebo z iného počítača.

Rozdiel v kóde oproti TCP:

TCP:

Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

UDP:

Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);

UDP client v c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace UDP_Client_socket
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                String str = String.Empty;
                IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10123);
                byte[] buffer = new byte[4096]; //buffer 4kB
                Console.WriteLine("Connecting.....");
                while (true)
                {
                    //zadame text na odoslanie
                    Console.WriteLine("Enter the string to be transmitted : ");
                    //nacitanie zadaneho textu do premennej
                    str =  Console.ReadLine();
                    //Ak zadam slovo koniec,tak sa ukonci
                    if (str == "koniec") break;
                    using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
                    {
                        //Convertovenie stringu na byte array
                        byte[] data = Encoding.ASCII.GetBytes(str);
                        //odoslanie spravy
                        sock.SendTo(data, data.Length, SocketFlags.None, iep);
                        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                        EndPoint Remote = (EndPoint)sender;
                        //prijatie odpovede od servera
                        int numberOfBytes = sock.ReceiveFrom(buffer, ref Remote);
                        byte[] formatedBytes = new byte[numberOfBytes];
                        Array.Copy(buffer, formatedBytes, numberOfBytes);
                        //Vypiseme co poslal server
                        Console.WriteLine("Server reply : ");
                        Console.WriteLine(ASCIIEncoding.ASCII.GetString(formatedBytes.ToArray()));
                        // Console.ReadLine();
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error..... " + e.Message);
                Console.ReadLine();
            }
        }
    }
}

UDP server v c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace UDP_Server_socket
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] buffer = new byte[4096];//4kb buffer
            try
            {
                Console.WriteLine("Server is running");
                Console.WriteLine("Waiting for connections...");
                using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
                {
                    //nacuvanie od vsetkych IP adries
                    IPEndPoint iep = new IPEndPoint(IPAddress.Any, 10123);
                    sock.Bind(iep);
                
                    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                    EndPoint Remote = (EndPoint)(sender);
                    while (true)
                    {
                        int numberOfBytes = sock.ReceiveFrom(buffer, ref Remote);
                    
                        byte[] formatedBytes = new byte[numberOfBytes];
                        Array.Copy(buffer, formatedBytes, numberOfBytes);
                        //Vypiseme co poslal server
                        Console.WriteLine("Client send : ");
                        Console.WriteLine(ASCIIEncoding.ASCII.GetString(formatedBytes));
                        //Odpoved servera
                        byte[] data = Encoding.ASCII.GetBytes("dakujem za spravicku");
                        sock.SendTo(data, data.Length, SocketFlags.None, Remote);
                    }
                }
            }
            catch (Exception ex1)
            {
                Console.WriteLine(ex1.Message);
            }        
        }
    }
}
Last modified on pondelok, 19 december 2016 21:26
Ing.Jaroslav Vadel

Som zakladateľom www.projectik.eu.

Hrám sa na programátora, ktorý ovláda:

c#,cpp,java,unity3d,php,html,NI testand,NI Vision Builder,Cognex In-Sight,NI LabView

"Naprogramovať program, ktorý funguje vie každy. Ale to, že program funguje ešte neznamena, že je napísany správne "

Website: www.projectik.eu

Related items