reconnect TCP klienta   otázka

C#

trošku si lámu hlavu s TCP klientem, připojení a přenos dat funguje, jen nějak nemohu vyřešit ošetření nedostupnosti serveru... tedy když zapnu klienta a server zatím není k dispozici, tak ať se mi pokouší dokola připojovat a také když spadne server, ať se klient zase zkusí připojovat... Používám synchronní spojení a zatím teda nic moc...

po startu jsem zkusil tohle:

while (!tcpClient.Connected)
            {
                try
                {
                    tcpClient.Connect(hostname, port);

                }
                catch
                {
                }

            }

ale to asi není to pravé ořechové, vytíží to procák a s aplikací nejde pracovat, dokud se se serverem nespojí. Případ pádu serveru v průběhu života klienta jsem ještě neřešil.

Poradil by někdo prosím?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co se týče vytížení procesoru tak použijte buď asynchronní přenos, nebo tu komunikaci přemístěte do vlastního vlákna. Co se týče obnovování spojení, tak to není nic jiného než cyklus a ošetřování vyjímek při vypršení časového limitu spojení a nedostupnosti serveru.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

takže třeba takhle?

public void Start(string hostname, int port)
        {
            ConnectParams connectParams;
            connectParams.hostname = hostname;
            connectParams.port = port;
            ParameterizedThreadStart paramVstupVlakna = new ParameterizedThreadStart(Connect);
            Thread ThreadsearchResult = new Thread(paramVstupVlakna);
            ThreadsearchResult.IsBackground = true;
            ThreadsearchResult.Start(connectParams); 
        }

        private void Connect(object parametry)
        {
            ConnectParams cParam = (ConnectParams)parametry;
            while (!tcpClient.Connected)
            {
                try
                {
                    tcpClient.Connect(cParam.hostname, cParam.port);

                }
                catch
                {
                }

            }
            ns = tcpClient.GetStream();
            sw = new StreamWriter(ns);
            sr = new StreamReader(ns);
            Thread thread = new Thread(new ThreadStart(ParseData));
            thread.IsBackground = true;
            thread.Start();
        } 

takhle sice aplikace úplně nezatuhne, ale i tak je značně zpomalena

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Doporučuji nastudovat základy síťové komunikace a zpracování ve vláknech. Na MSDN a CodeProjectu je spousta příkladů. Nevím co myslíte tím "značně zpomalena", ale pokud zpracování přenesete do vlastního vlákna, tak hlavní vlákno aplikace zůstane volné a uživatelské rozhraní nevytuhne, což je jeden z hlavních důvodů proč se to dělá.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

takže tak jak to mám v příkladu, je to špatně?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

to cekani pri nedostupnosti serveru jsem teda udelal tak, jak je v prikladu vyse a do cyklu jsem tal Thread.Sleep(5000) a uz to netuhne a chova se to jak ma...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to čekání na start serveru už mám vyřešené, ale ošetření případu, kdy server spadne mi nějak nejde... nevím, jak provést reconnect...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

S reconnectem bude trochu problém, to, že spojení spadlo, zjistíte většinou tak, že se snažíte číst nebo psát a dostanete po čumáku exceptionou. Pak musíte vytvořit nový socket, připojit se a jet znovu.

Jinak veškeré síťové operace je velmi vhodné provádět v jiném vlákně, abyste si nezatěžoval hlavní vlákno aplikace.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nejak mi unika duvod pouziti dalsiho vlakna. Jelikoz to vypada ze se ucite tak pro pripadne vraceni hodnot z vlakna budete potrebovat delegata atp. Kdezto kdybyste kod zavedl do timeru tak odpadaji dalsi problemy a vyhnete se tim i Thread.Sleep. Temi problemy mam namysli hlavne vymenu pripadnych dat. Osetreni vyjimek vzniklych ve vlakne apod. Prez timer je to vse snazsi.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A co si myslíte že je Timer? Nápověda: Vlastní vlákno zabalené do třídy tak, aby bylo jednoduše použitelné... To předávání dat by šlo samozřejmě vyřešit i bez delegáta.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback