TCP připojení v C# .NET

C# .NET Pro pokročilé TCP připojení v C# .NET

Takže především si popíšeme jak to celé funguje a co k tomu budeme potřebovat.

Popíšeme si metodu připojení Client / Server. To znamená, že si vytvoříme nějaký jednoduchý server, který bude naslouchat na nějakém portu. K tomu si vytvoříme nějakého jednoduchého klienta, který nám bude data odesílat na server na portu, který bude server naslouchat.

TCP připojení určitě každý zná, ale pokud ne...

TCP (Transmission Control Protocol) je služba, která je spolehlivá na rozdíl od služby UDP. TCP připojení se pojí se serverem nebo klientem tak, že naváže spojení na 3x a ukončuje spojení na 4x. V realném životě by to mohlo vypadat nějak takto : (doufám že se nepletu)

Navázání spojení :

klient : Ahoj, tady klient!
server : Ahoj, tady server. Co potřebuješ?
klient : Chtěl bych odeslat nějaká data, tak mi prosím naslouchej. :)
klient -> odesílá data...

Ukončení spojení :

klient : Ahoj, chtěl bych ukončit spojení.
server : Okay, opravdu chceš spojení ukončit?
klient : Ano, opravdu chci.
server : Dobře, ukončují spojení.

Tak, a teď už zase k DOTNETU. Budeme potřebovat naincludovat dvě třídy asice :

using System.Net;
using System.Net.Sockets;

Vytvoříme si tedy první server:

Zde hodím kód a poté vysvětlím.

static byte[] data;  // 1
static Socket socket; // 1
static void Main(string[] args)
{
    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 2
    socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666)); // 3

    socket.Listen(1); // 4
    Socket accepteddata = socket.Accept(); // 5
    data = new byte[accepteddata.SendBufferSize]; // 6
    int j = accepteddata.Receive(data); // 7
    byte[] adata = new byte[j];         // 7
    for (int i = 0; i < j; i++)         // 7
        adata[i] = data[i];             // 7
    string dat = Encoding.Default.GetString(adata); // 8
    Console.WriteLine(dat);                         // 8
}

Takže, teď vysvětlím, co se v tom kódu vůbec děje.

  1. Vytvořím si statickou proměnnou data typu byte a třídu socket.
  2. Vytvořím si nový socket s typem socketu, jaký má protokol -> všimněte si, že jsem použil ProtocolType.Tcp (nečekaně).
  3. Vytvořím si nový IPEndPoint, což je cílová adresa, kterou chceme hostovat. V našem případě je to localhost. Také lze zaměnit IPAddress.Par­se("127.0.0.1") za 0. No a port (libovolný), v našem případě 6666. Funkce Bind přiřadí připojení k právě zmíněné IP adrese a portu.
  4. Funkce Listen(); slouží k tomu, aby server věděl vlastně kolik může maximálně naslouchat uživatelů. V našem případě je to jen jeden.
  5. Ani nemusím vysvětlovat, prostě si vytvořím nový socket s datama co přijdou.
  6. Do proměnné typu byte se nám uloží data co přijdou.
  7. Zjednodušeně řečeno : "přeuložím si data co přijdou do nové proměnné", abych nedekódoval stále přicházející data.
  8. Dekóduji data pomocí metody Default, což podporuje tuším snad všechny znaky -> taky tam je možnost ASCII a tak podobně, no a pak jen tisknu data co přijdou na obrazovku.

Tak a máme server. Pustíme se tedy do klienta, ten je obzvlášť jednoduchý.

using System.Net;
using System.Net.Sockets;
static void Main(string[] args)
        {
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try // 1
            {
                s.Connect(IPAddress.Parse("127.0.0.1"), 6666); // 2
                Console.Write("Zadej nejakej text : ");
                string q = Console.ReadLine();                 // 3
                byte[] data = Encoding.Default.GetBytes(q);    // 3
                s.Send(data);
            }
            catch // 1
            {
                // nepripojeno
            }
        }

Myslím, že je vše jasné, ale pro pořádek. (to, co bylo vysvětlené u serveru, již popisovat nebudu).

  1. Zkusím se připojit na server. Pokud to půjde, dostaneme se dále. Pokud ne, smůla, vyskočí třeba nějaká chybová hláška.
  2. Zkusím se tedy připojit pomocí funkce Connect. Naparsujeme si opět IP adresu ze stringu a zadáme port, který server naslouchá, tudíž 6666.
  3. Uživatel zadá nějaký text, já si ho uložím a zakóduji pomocí metody default do proměnné, kterou jsem si vytvořil. Je to proměnná data typu byte.
  4. A tadá, odešlu data na server. :)
asd

Vše jsem zkoušel, mělo by vše jít bez problému. Až budu mít zase chuť, zkusíme si udělat úplně jednoduchý IM nebo třeba hada (multiplayer). :)


 

Stáhnout

Staženo 747x (40.35 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal Зайчик
Avatar
Коммунизм для нашего будущего!

Jak se ti líbí článek?
Celkem (4 hlasů) :
4.254.254.254.25 4.25


 


Miniatura
Všechny články v sekci
C# - Pro pokročilé
Miniatura
Následující článek
Spouštění programů po startu v C#

 

 

Komentáře
Zobrazit starší komentáře (12)

Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovědět 25.5.2013 18:35
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
toflu
Člen
Avatar
Odpovídá na David Čápka
toflu:

Ale jak koukám na tvé zdrojáky, tak tam máš taky použité sockety... :-)

 
Odpovědět 1.12.2013 22:06
Avatar
Cloudy
Člen
Avatar
Cloudy:

Jak vím tak většina serveru má vypisování a čtení z klávesnice, většina těch větších projektů toto potřebuje už z důvodu ovládání toho serveru :) či zjištění co se právě děje :)

 
Odpovědět 22.12.2013 19:18
Avatar
Kit
Redaktor
Avatar
Odpovídá na Cloudy
Kit:

Pod pojmem "server" si představuješ železo nebo službu? Pokud železo, tak tě asi zklamu: Většina serverů nemá klávesnici ani monitor. A už vůbec ne myš...

Editováno 22.12.2013 19:27
Odpovědět 22.12.2013 19:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Cloudy
Člen
Avatar
Cloudy:

Dohadujeme se tu a každý znás má pravdu, jsou servery kteří lidi hostují na svém pc kdež se hodí ukazovat informace o serveru či číst z klávesnice nebo jsou to servery které fungují na nějakém postaveném stroji přimo pro toto, to už je jasné že monitor nebude potřeba, ale tento server by zase měl zajišťovat posílaní informací někam kde by se server dal ovládát vzdáleně, třeba přes browser. :)

 
Odpovědět 23.12.2013 10:22
Avatar
Ondrca
Redaktor
Avatar
Ondrca:

Ahoj, proč můžu odeslat jen 1 zprávu a pak to spadne?

Odpovědět  +1 12.2.2014 11:20
Zase jsem o něco chytřejší
Avatar
Odpovídá na Ondrca
tomekmichalhu:

protože tam není žádná smyčka, čeká to na zprávu a když jí dostane tak se pogram ukončí, dej tam while(true) a pojede to

 
Odpovědět  +1 10.3.2015 19:30
Avatar
milanhotovec
Člen
Avatar
milanhotovec:

Zdravím, zkusil jsem vytvořit totožný program ve Win Forms, ale setkal jsem se s problémem, klient, který jsem zkusil funguje, ale server okamžitě po aktivaci zamrzne a nefunguje, nevíte co s tím ?
Pokud použiji jako server Consolovku tak to funguje, ale s Win Forms ne...

 
Odpovědět 16.4.2015 19:34
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na milanhotovec
Jiří Gracík:

Nejspíš budeš muset naslouchat na jiném vlákně, než na tom hlavním :)

Odpovědět  +2 16.4.2015 19:42
Creating websites is awesome till you see the result in another browser ...
Avatar
marek.figura1:

Ahoj,
Spravil som si TCP komunikaciu server - client. Ale ked zapnem prveho clienta tak mi to spadne. Opacne sa najdu a komunikacia funguje v pohode.

http://www.itnetwork.cz/dev-lighter/760

 
Odpovědět 20. července 13:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 22. Zobrazit vše