NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: NetworkStream.Read(Byte[], Int32, Int32) - čekání na celou zprávu

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

Aktivity
Avatar
Erik Šťastný:28.11.2016 11:31

Zdravím,

Mám aplikaci ve které posílám přes TCP data ve formátu (4B-délka zprávy,zpráva)

V mém případě odesílám zprávy krátké v řádu 10-100B a žádného problému jsem si na debugování na localu nevšiml.

Nicméně jsem byl upozorněn ať si na to dám pozor, že při delší zprávě nebo chybě na sítí nebo něco metoda Read na nic nečeká a i když je ve formátu Read(Byte[], In­t32, 50), tak nečeká na 50 bytů ale vrátí jen to co tam aktuálně je. Což mi ve finále rozháže úplně celé zprávy a nikdo nebude vědět co mu vlastně došlo.

Otázka zní jak dosílit aby se vždy počkalo na celou zprávu ?

Musím si napsat vlastní cyklus který bude nějak počítat přijaté Byte a pokaždé snižovat byte ke čtení, nebo existuje mnohem jednodušší způsob?

 
Odpovědět
28.11.2016 11:31
Avatar
Odpovídá na Erik Šťastný
Luboš Běhounek Satik:28.11.2016 11:48

Nejdřív by možná bylo dobrý zmínit, jakou třídu k té TCP komunikaci používáš :)

Nahoru Odpovědět
28.11.2016 11:48
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Luboš Běhounek Satik
Erik Šťastný:28.11.2016 11:51

Jo to mi tam nějak vypadlo :-O

TCPClient <> TCPListener a NetworkStream pro oba

 
Nahoru Odpovědět
28.11.2016 11:51
Avatar
Odpovídá na Erik Šťastný
Marian Benčat:28.11.2016 12:47

Read data jako navratovou hodnotu vrací počet skutečně přečtených bytu, může jich přečíst méně. TCP ti zaručuje, že přijdou všechny části a že přijdou správně seřazeny. Na serveru ale není jisté, že budou v jednom "readu" všechny.

Proto ta děláš běžně to, že tam máš ještě jeden cyklus, kde ctes z Readu() dokud ti nedorazi zprava cela (pocitas si byty). No a vzdy prectes a zapises to do bufferu (pomoci toho Read()). A az kdyz ti

pocet celkove prectenych pomoci read = velikost zpravy.

Tak víš, že zpráva je celá a správně splitnutá.

Editováno 28.11.2016 12:47
Nahoru Odpovědět
28.11.2016 12:47
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Erik Šťastný:28.11.2016 12:54

No jasné no, to jsem věděl, ostatně moje otázka v poslední větě byla jestli si to prostě musím zacyklit sám nebo na to v .NETu existuje něco jiného nebo nějaký fýgl :)

 
Nahoru Odpovědět
28.11.2016 12:54
Avatar
Odpovídá na Erik Šťastný
Marian Benčat:28.11.2016 13:01

Samozrejme ze na to v .NETu existuje tisíce a jedna knihovna, jako všude jinde. Zalezi jen na tom, jak moc vyssi reseni chces. Jedno z nich je treba WCF :-)

Nahoru Odpovědět
28.11.2016 13:01
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Erik Šťastný:28.11.2016 13:06

Spíš by mi stačilo ten buffer předávát do bufferu, který bude mít, read který čeká na celý počet bytů co zadám :D

Rozhodně nic co by zapříčinilo velké přepisování to si můžu rovnou udělat ten cyklus :)

Jen ten kód nechci zaplácávat cyklama na to čtení pokud existuje možnost jednoho konstruktoru a jedné metody třeba :)

 
Nahoru Odpovědět
28.11.2016 13:06
Avatar
Odpovídá na Marian Benčat
Erik Šťastný:30.11.2016 14:30

No nic,tak to balím do cyklu :)

Editováno 30.11.2016 14:30
 
Nahoru Odpovědět
30.11.2016 14: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 8 zpráv z 8.