c# tcp client

Programovacie jazyky, rady, poradňa...
Blade.m
Medium Star
Medium Star
Príspevky: 454
Registrovaný: 06 apr 2007, 20:10
Bydlisko: Čadca

c# tcp client

Príspevok od používateľa Blade.m »

Zdravím,
skúšam si pripojenie na server. Na klientskej časti mám tento kód:

Kód: Vybrať všetko

string message = "správa na server";

using (StreamSocket tcpClient = new StreamSocket())
{
     await tcpClient.ConnectAsync(new HostName("localhost"), "4000");

     using(DataWriter writer = new DataWriter(tcpClient.OutputStream))
     {
          writer.WriteString(message);
          await writer.StoreAsync();
          await writer.FlushAsync();
     }

     using (DataReader reader = new DataReader(tcpClient.InputStream))
     {
          reader.InputStreamOptions = Partial;
          await reader.LoadAsync(reader.UnconsumedBufferLength);
     }
}
Na server potrebujem poslať správu v JSON formáte a tu som narazil na problém, keď sa pokúšam serializovať objekt, tak MemoryStream je prázdny, resp. po prevedení na pole je message prázdne. Vedel by mi niekto poradiť ako na to?

Ďakujem za každú radu.


//UPDATE

Kód som upravil, ale stále mám problém s odosielaním. Dáta sú odoslané, ale až po tom ako sa uvoľní StreamSocket a tým pádom správa zo servera mi nepríde, vedel by mi niekto poradiť ako na to?
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: c# tcp client

Príspevok od používateľa axxis »

Cely ten kod vyzera dost divne (mas tam reader, ktory ani nepouzijes a vytvaras spravu, ktoru chces potom precitat - naco? ocakavas, ze v nej bude nieco ine ako si tam napisal? navyse ked to precitas uz tam nemusi ostat). Ale minimum toho co mozes[musis] urobit je tie streamy zatvarat.

na vsetko co konci stream pouzivat konstrukciu, to iste plati aj pre SteramReader a StreamWriter

Kód: Vybrať všetko

using(var memStream = new MemoryStream())
{
          //vsetka praca s objektom vnutri tohto bloku
}
Blade.m
Medium Star
Medium Star
Príspevky: 454
Registrovaný: 06 apr 2007, 20:10
Bydlisko: Čadca

Re: c# tcp client

Príspevok od používateľa Blade.m »

to bol kód písaný na rýchlo, aby som vyskúšal zaslanie dát na server a ten mi mal vrátiť odpoveď vo forme json správy
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: c# tcp client

Príspevok od používateľa pcsiete »

Ak ti kód nefunguje, skús debugovať.
Ak ti kód stále nebude fungovať, pokračuj v debugovaní.
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: c# tcp client

Príspevok od používateľa axxis »

pcsiete napísal:Ak ti kód nefunguje, skús debugovať.
Ak ti kód stále nebude fungovať, pokračuj v debugovaní.
A to, dami a pani, je rada roku.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: c# tcp client

Príspevok od používateľa pcsiete »

Tak milé dámi a páni, pozrime sa na ten kód...
TcpClient connection = new TcpClient("localhost", 4000);
NetworkStream stream = connection.GetStream();
var reader = new StreamReader(stream);
var writer = new StreamWriter(stream);
Message message = new Message() { Mess = "test" };
Vytvorím nový objekt TcpClient, pripojím sa a ignorujem to že môže dôjsť k výnimke, čo je ale ok, pretože kód len skúšam.
Vytvorím nový objekt typu Message a priradím ho k premennej message.
DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(Message));
MemoryStream ms = new MemoryStream();
json.WriteObject(ms, message );
string message = Encoding.UTF8.GetString(ms.ToArray());
writer.WriteLine(message);
writer.Flush();
Vytvorím nový memory stream, zapíšem doňho svoj objekt uložený v message. Potom znova deklarujem premennú message, tentoraz ako String. To, čo som do memory streamu zapísal znova prečítam, a následne znova zapíšem.

Kompilátor takýto kód ani neskompiluje, ale ja napíšem na fórum že ms.ToArray() vracia prázdne pole. Nenapíšem síce ako som na to prišiel (výnimka, chyba, zlý výstup), ale viem to a mne to stačí.

Tak a teraz mohli nastať dve situácie:
  1. nemám šajnu o tom čo vlastne píšem a teda je logicky nutné aby som si to naštudoval
  2. skúšam v skutočnosti úplne iný kód, ale na fórum napíšem tento - zjednodušený. V takom prípade jediné čo môžem robiť je debugovať, lebo na fóre nemôžu vedieť aký kód v skutočnosti používam, keď som ho tam nenapísal.
@axxis: rada roku pre programátorský problém roka.
Blade.m
Medium Star
Medium Star
Príspevky: 454
Registrovaný: 06 apr 2007, 20:10
Bydlisko: Čadca

Re: c# tcp client

Príspevok od používateľa Blade.m »

Išlo o druhý prípad, pri odosielaní dát som skúšal viac metód a pri prekopírovaní tu na fórum som si toho nevšimol.

Kód som upravil, ale stále mám problém s odosielaním. Dáta sú odoslané, ale až po tom ako sa uvoľní StreamSocket a tým pádom správa zo servera mi nepríde, vedel by mi niekto poradiť ako na to?
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: c# tcp client

Príspevok od používateľa pcsiete »

Kód: Vybrať všetko

await tcpClient.ConnectAsync(new HostName("localhost"), "4000");
Toto ti kompilátor zoberie?

Teraz úplne mimo to: používaš await veľmi často a vždy hneď s volaním metódy. To znamená že vždy čakáš na ukončenie metódy a teda vytváraš synchrónne správanie asynchrónnym spôsobom. Výsledok je teda pomalší než by bol za použitia synchrónnych metód, pretože operačný systém vždy suspenduje vykonávanie aktuálneho vlákna a vytvára nové.

V danom príklade ti úplne stačí použitie synchrónnych metód.
Blade.m
Medium Star
Medium Star
Príspevky: 454
Registrovaný: 06 apr 2007, 20:10
Bydlisko: Čadca

Re: c# tcp client

Príspevok od používateľa Blade.m »

synchrónna verzia nie je, ide o windows RT aplikáciu a ten kód mi prejde celý, ale správa mi na server príde len vtedy, ak uvoľním StreamSocket
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: c# tcp client

Príspevok od používateľa axxis »

Blade.m napísal:
Spoiler
Zdravím,
skúšam si pripojenie na server. Na klientskej časti mám tento kód:

Kód: Vybrať všetko

string message = "správa na server";

using (StreamSocket tcpClient = new StreamSocket())
{
     await tcpClient.ConnectAsync(new HostName("localhost"), "4000");

     using(DataWriter writer = new DataWriter(tcpClient.OutputStream))
     {
          writer.WriteString(message);
          await writer.StoreAsync();
          await writer.FlushAsync();
     }

     using (DataReader reader = new DataReader(tcpClient.InputStream))
     {
          reader.InputStreamOptions = Partial;
          await reader.LoadAsync(reader.UnconsumedBufferLength);
     }
}
Na server potrebujem poslať správu v JSON formáte a tu som narazil na problém, keď sa pokúšam serializovať objekt, tak MemoryStream je prázdny, resp. po prevedení na pole je message prázdne. Vedel by mi niekto poradiť ako na to?

Ďakujem za každú radu.
Presne takto vyzera kod ludi, ktori tvrdia, ze teoriu programovacich jazykov a kompilatorov nepotrebuju. To su vsetko veci 90-tych rokov. Potom zacnu do svojho kodu pchat tisice klucovych slov a instainciovat kazdy objekt .NETu, ktory je prave po ruke, ved ono to nejako bude fungovat.

Btw. Kde si zobral to await? Ja v c# programujem uz niekolko rokov a ani som nevedel, ze take klucove slovo tam je.


Pcsiete: vycitas mu nieco co vobec nie je pravda, ked uz si ten odbornik cez kompilacie mohol si si aj dohladat, ze await nerobi synchronnu metodu asynchronnou.

Kód: Vybrať všetko

using(TcpClient client = new TcpClient())
{
   IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4000);

   client.Connect(serverEndPoint);

   using(NetworkStream clientStream = client.GetStream())
   {
      ASCIIEncoding encoder = new ASCIIEncoding();
      byte[] buffer = encoder.GetBytes("Fuck dog server!");

      clientStream.Write(buffer, 0 , buffer.Length);

      //toto tu asi ani netreba, lebo sa to spravi v disposovani, ale uskodit to tu tiez nemoze
      clientStream.Flush();
   }
}
Inac ak nevies kam sa mas pozriet tak MSDN je vzdy prvy zdroj http://msdn.microsoft.com/en-us/library ... lient.aspx
Mas tam funkcny navod ako spravu poslat a aj ako precitat odpoved. Kludne Ti staci na tu metodu pouzivat copy-paste
Blade.m
Medium Star
Medium Star
Príspevky: 454
Registrovaný: 06 apr 2007, 20:10
Bydlisko: Čadca

Re: c# tcp client

Príspevok od používateľa Blade.m »

samozrejme, že msdn je prvá stránka kde pozerám, ale keď sa mi už nedarilo nájsť nič ani na google, tak som napísal sem...vyskúšal som všetky príklady, no nič nepomohlo...nakoniec som zistil, že chyba bola na strane serveru

môžete lock
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: c# tcp client

Príspevok od používateľa pcsiete »

axxis napísal:
Btw. Kde si zobral to await? Ja v c# programujem uz niekolko rokov a ani som nevedel, ze take klucove slovo tam je.
C# 5.0
Pcsiete: vycitas mu nieco co vobec nie je pravda, ked uz si ten odbornik cez kompilacie mohol si si aj dohladat, ze await nerobi synchronnu metodu asynchronnou.
ak použiješ await na volanie async. metódy, aktuálne vlákno čaká na jej dokončenie v druhom vlákne.

Voľne jednoducho povedzme, že async. kód (v tomto prípade) je kód v ktorom sa v jednom momente vykonávajú dve a viac úloh (ignorujme existenciu pseudopararelizmu).
Potom povedzme, že sync. kód je kód v ktorom sa v jednom momente vykonáva len jedna úloha.

Tak ak pri každom spustení nového vlákna suspenduješ aktuálne a čakáš na dokončenie nového, v jednom momente sa vykonáva len jedna úloha. V obidvoch prípadoch sme v jednom kontexte, to znamená že vo výsledku vedie také používanie k strate zmyslu async. metód => teda sa jedná o synchrónne pracujúci kód + overhead spôsobený prepínaním a suspendovaním vlákna ešte znižuje efektivitu takého kódu oproti bežnému synchrónnemu.

Odporúčam ti pozrieť si novinky v .NET 4.5 (sekcia Parallel Computing) :smt006 .
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: c# tcp client

Príspevok od používateľa axxis »

pcsiete napísal: C# 5.0


ak použiješ await na volanie async. metódy, aktuálne vlákno čaká na jej dokončenie v druhom vlákne.

Voľne jednoducho povedzme, že async. kód (v tomto prípade) je kód v ktorom sa v jednom momente vykonávajú dve a viac úloh (ignorujme existenciu pseudopararelizmu).
Potom povedzme, že sync. kód je kód v ktorom sa v jednom momente vykonáva len jedna úloha.

Tak ak pri každom spustení nového vlákna suspenduješ aktuálne a čakáš na dokončenie nového, v jednom momente sa vykonáva len jedna úloha. V obidvoch prípadoch sme v jednom kontexte, to znamená že vo výsledku vedie také používanie k strate zmyslu async. metód => teda sa jedná o synchrónne pracujúci kód + overhead spôsobený prepínaním a suspendovaním vlákna ešte znižuje efektivitu takého kódu oproti bežnému synchrónnemu.

Odporúčam ti pozrieť si novinky v .NET 4.5 (sekcia Parallel Computing) :smt006 .
Diky kapitan, zrovna dnes som dostal ban na vsetky vyhladavace sveta takze som nebol schopny dohladat si kde bolo toto klucove slovo zavedene a co robi.

Btw. som sa odrbal, lebo som si nevsimol, ze vola Async verzie tych metod. Myslel som, ze pouziva tie iste co v originalnom kode. (preto ten komentar o synchonnych metodach)
Napísať odpoveď