Diskuze: TCP server
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 9 zpráv z 9.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Mělo by to jít takhle (nezkoušel jsem):
CLIENT:
TcpClient client = new TcpClient();
client.Connect(ip, 9999); // ip serveru, port
NetworkStream stream = client.GetStream();
while (true) // Nebo dokud nebudes chtit zavrit komunikaci
{
string response = String.Empty;
byte[] Cdata = new byte[256];
int bytes = stream.Read(Cdata, 0, Cdata.Length); // Tady mas data
response = Encoding.ASCII.GetString(Cdata, 0, bytes); // Kdybys posilal treba text, takhle to hodis do stringu
Console.WriteLine("Received string: " + response);
}
stream.Close(); // Odpojeni klienta
client.Close();
SERVER:
TcpListener server = new TcpListener(IPAddress.Parse(ip), 9999); //ip = IP adresa serveru, 9999 je port
server.Start();
TcpClient myClient = server.AcceptTcpClient();
NetworkStream myStream = myClient.GetStream();
while (true) // Dokud budes neco posilat
{
byte[] msg = System.Text.Encoding.ASCII.GetBytes("data"); // Data co budes posilat. Budto byte[], nebo muzes posilat string
myStream.Write(msg, 0, msg.Length);
}
// Vypni server (nebo skoc na zacatek a cekej na dalsiho klienta)
myClient.Close();
Ahoj,
nie, tak ako pises to nepojde. Neviem z uvedeneho zistit ci sa pocas komunikacie
odpojil alebo nie. Ak by som pouzil read ktory by to cital, zablokoval by som
cely cyklus...
Write na serveri myStream.Write(msg, 0, msg.Length); nezneguje
while(true)...
Tak to asi budeš asi muset udělat tak, že
nebo
Posílání zpráv serveru: [CLIENT]
byte[] data = Encoding.ASCII.GetBytes("Jsem online");
stream.Write(data, 0, data.Length);
Přijímání zpráv od clienta: [SERVER]
string zprava;
byte data = new byte[256];
while ((i = myStream.Read(data, 0, data.Length)) != 0)
{
zprava = System.Text.Encoding.ASCII.GetString(data, 0, i);
Console.WriteLine("Received string: " + zprava);
}
Nemozem ovplyvnit klientsku aplikaciu. Ta je dana.
Klient sa pripoji a caka na data ktore mu server posle. Ked mu nieco posle,
spracuje ich a caka na dalsie alebo ak mu stacia tak zatvori spojenie (read
vrati 0). Read nemozem vracat lebo je to blocking funkcia.
Nerozumím, proč mluvíš o Read, když klienta nemůžeš ovlivnit. Myslíš tím tedy volání Write na serveru (protože podle toho, co píšeš, tak server jen zapisuje a klient jen čte)?
Mělo by být možné nastavit na Write nějaký timeout, který když vyprší, funkce vrátí nějakou hodnotu nebo vyhodí výjimku. Stejně musíš řešit případy, kdy spojení spadne "samo od sebe".
Klienta nemozem ovplyvnit, ten je dany.
Klient sa pripoji na Server a caka na data. Server mu ich posle a ma
skontrolovat, ci je klient stale pripojeny. Ak nie, server ukonci cyklus a caka
na nove spojenie.
Read som pouzival pretoze cez neho viem zistit, ci je velkost prijatych dat
<1. V tom pripade viem, ze klient sa odpojil.
Podle tohoto
https://msdn.microsoft.com/…vs.110).aspx
nastavíš vlastnost SendTimeout instance TcpClient, kteoru dostaneš z acceptu, na nějakou rozumnou hodnotu (třeba pět vteřin = 5000). Pokud se volání Write zablokuje na delší dobu, vyhodí výjimku SocketException. Tím se zároveň dozvíš, že klient se pravděpodobně odpojil (ať už chtěl, nebo prostě spadlo připojení).
Další relativně jednoduchá kontrola je, že se pokusíš zapsat nic do toho streamu... Nevím, jak moc je to správné řešení, ale funguje to dobře. Hlavně jde o to, že tím nic neovlivníš...
try
{
client.GetStream().Write(new byte[] { }, 0, 0);
}
catch
{
// Stream je uzavřený a klient odpojený
}
Zobrazeno 9 zpráv z 9.