Slevový týden - Květen Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
30 % bodů zdarma na online výuku díky naší Slevové akci!

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í :

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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 991x (40.35 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Článek pro vás napsal Зайчик
Avatar
Jak se ti líbí článek?
5 hlasů
Коммунизм для нашего будущего!
Předchozí článek
Práce se soubory a složkami v C# .NET
Všechny články v sekci
Práce se soubory a sítí v C#
Aktivity (2)

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:18.2.2013 12:44

Super, k tomu jsem se chtěl vždycky dostat a nedostal jsem se. Hadů tu je hodně, ale takové lodě po multiplayeru by byly docela cool :)

Odpovědět
18.2.2013 12:44
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Mediel
Redaktor
Avatar
Odpovídá na David Čápka
Mediel:18.2.2013 13:04

Lode po MP jsem delal, ale z nedostatku casu nedodelal ...

Odpovědět
18.2.2013 13:04
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
Зайчик
Člen
Avatar
Odpovídá na Mediel
Зайчик:18.2.2013 13:27

Můžu zkusit :) jak bude čas / chuť :P

Odpovědět
18.2.2013 13:27
Коммунизм для нашего будущего!
Avatar
Michael Olšavský:18.2.2013 16:31

Skvělé. Konečně chápu jak to funguje :-)

 
Odpovědět
18.2.2013 16:31
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:18.2.2013 17:29

Hlavní výhodou TCP je kontrola příchozích dat pomocí Aknownlegment a Sequence number, tedy neustále kontroluje zda odeslaná data přišla, pokud ne pošle je znova. TCP se tedy nepoužívá, kde není potřeba aby data opravdu došla (stream videa,...)

Odpovědět
18.2.2013 17:29
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Mediel
Redaktor
Avatar
Mediel:19.2.2013 8:51

Určitě by to chtělo rozšířit třeba v pokročování o vlákna pro každého připojeného klienta, TCP/IP bez vláken je jako ten dětský telefon (provaz a 2 kelímky).

Odpovědět
19.2.2013 8:51
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
Зайчик
Člen
Avatar
Odpovídá na Mediel
Зайчик:19.2.2013 11:36

Jasný to byla jen ukázka ;) něco jako hello world akorát v TCP :)

Odpovědět
19.2.2013 11:36
Коммунизм для нашего будущего!
Avatar
Kit
Redaktor
Avatar
Kit:19.2.2013 12:25

Vypadá to zajímavě. Jen by server neměl nic vypisovat na obrazovku a neměl by ani nic číst z klávesnice. Je to jen server, který má pouze pracovat s klienty a nic víc.

Příležitostně to možná přepíšu do Javy.

Odpovědět
19.2.2013 12:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Зайчик
Člen
Avatar
Odpovídá na Kit
Зайчик:19.2.2013 12:37

Jasné, to je tam jen proto aby bylo jasné že to přislo že vzniklo spojení :) a tak

Odpovědět
19.2.2013 12:37
Коммунизм для нашего будущего!
Avatar
Standas
Neregistrovaný
Avatar
Standas:25.5.2013 13:24

Super článek, jako hello world v TCP super. Ještě bych potřeboval druhou lekci po hello world - console.readline...
Mám hardwarový převodník, který poslouchá na TCP portu. Když mu pošlu string, ihned odpovídá. Jestli to dobře chápu, jde mi jen o stranu klienta, ale potřebuji, aby po odeslání dat ihned naslouchal a přijaté uložil do stringu.
Šel by tento příklad rozšířit o odpověď serveru "OK", která se vypíše na straně klienta?
Nebo pro tento příjem musím založit klienta i server zároveň? Díky

 
Odpovědět
25.5.2013 13:24
Avatar
Зайчик
Člen
Avatar
Odpovídá na Standas
Зайчик:25.5.2013 13:28

to se dělá přes vlákna já už v C# nedělám takže další článek o tom psát nebudu snad někdo jiný

Odpovědět
25.5.2013 13:28
Коммунизм для нашего будущего!
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Standas
David Čápka:25.5.2013 13:53

Vůbec bych to nedělal přes sockety, C# má lepší třídy. Mám k tomu napsaný příklad, když si na to vzpomenu, tak ti ho sem dám.

Odpovědět
25.5.2013 13:53
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovědět
25.5.2013 18:35
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
toflu
Člen
Avatar
Odpovídá na David Čápka
toflu:1.12.2013 22:06

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
Odpovídá na Kit
Cloudy:22.12.2013 19:18

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:22.12.2013 19:24

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:23.12.2013 10:22

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
Odpovídá na Зайчик
Ondrca:12.2.2014 11:20

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

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

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
10.3.2015 19:30
Avatar
milanhotovec
Člen
Avatar
milanhotovec:16.4.2015 19:34

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
Odpovídá na milanhotovec
Neaktivní uživatel:16.4.2015 19:42

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

Odpovědět
16.4.2015 19:42
Neaktivní uživatelský účet
Avatar
marek.figura1:20.7.2016 13:30

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.7.2016 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 22 zpráv z 22.