Avatar billede burningice Nybegynder
08. marts 2005 - 11:41 Der er 14 kommentarer og
1 løsning

Lukke en TcpClient ned

Jeg har lavet mig et serverprogram som opretter en Client-class for hver connection der bliver lavet og udfører en Handle()-metode i sin egen tråd.

I denne Handle går jeg ind i en løkke der skal køre så længe at en variabel er sand, og det er meningen at serveren skal nedlægge connectionen når denne variabel ændres til falsk. Nu problemet bare at inde i løkken, som lytter på input, hænger udførslen ved en ReadLine(), dvs. at selvom kør-vriablen ændres til falsk lukkes forbindelsen først efter næste modtagelse af en kommando.

Det er helt sikkert en uhensigtsmæssighed i min struktur af Handle-metoden, men jeg ved ikke lige hvordan den ellers skal laves.

public void Handle()
        {
            WriteLine("Hello");
            sWriter.Flush();
           
            while (continueHandling)
            {
                Command comm = new Command(sReader.ReadLine(), ' ');

                if (comm.Name == "end") break;

                if (!comm.IsValid)
                {
                    WriteLine("Unknown command");
                }
                else
                {
                    try
                    {
                        comm.Invoke(this.commHandler);
                    }
                    catch (ArgumentException)
                    {
                        WriteLine("Invalid arguments");
                    }
                    catch (Exception e)
                    {
                        Write(e.ToString());
                        continueHandling = false;
                    }
                }

                sWriter.Flush();
            }

            disconnect();
        }
Avatar billede burningice Nybegynder
08. marts 2005 - 11:54 #1
well well... lader til der er en DataAvailable-property på NetworkStream-klassen man kan bruge. For ikke at bruge for mange ressourcer har jeg valgt at lave en Thread.Sleep i bunden af løkken - er der andre måder at løse det problem på?

public void Handle()
        {
            WriteLine(DateTime.Now +": Hello");
            sWriter.Flush();
           
            while (continueHandling)
            {
                if (client.GetStream().DataAvailable)
                {
                    Command comm = new Command(sReader.ReadLine(), ' ');

                    if (comm.Name == "end") break;

                    if (!comm.IsValid)
                    {
                        WriteLine("Unknown command");
                    }
                    else
                    {
                        try
                        {
                            comm.Invoke(this.commHandler);
                        }
                        catch (ArgumentException)
                        {
                            WriteLine("Invalid arguments");
                        }
                        catch (Exception e)
                        {
                            Write(e.ToString());
                            continueHandling = false;
                        }
                    }

                    sWriter.Flush();
                }
                else Thread.Sleep(100);
            }

            disconnect();
        }
Avatar billede lifo Nybegynder
08. marts 2005 - 14:32 #2
tror at du også kan aborte din handle tråd og så fange ThreadAbortException
Avatar billede arne_v Ekspert
08. marts 2005 - 23:22 #3
Du kunne bruge Abort og ThreadAbortException

Men jeg ville nok bruge Interrupt og ThreadInterruptedException
Avatar billede arne_v Ekspert
08. marts 2005 - 23:23 #4
Interrupt og ThreadInterruptedException sammen med et flag
Avatar billede burningice Nybegynder
09. marts 2005 - 00:12 #5
vil det være pænt... bare at lukke tråden ned uden at close ens listener?
Avatar billede arne_v Ekspert
09. marts 2005 - 07:37 #6
Listeneren ligger jo nok i dit hoved program ikke i din tråd og vil typisk
være en uendelig løkke.

Clienten kan du sagtens lukke ned hvis du catcher exception.
Avatar billede burningice Nybegynder
09. marts 2005 - 09:14 #7
:) ja, nu mente jeg heller ikke listener, ved ikke lige hvorfor jeg skrev det. Det er selvfølgelig  min StreamReader, StreamWriter og TcpClient jeg skal lukke pænt ned. Men det kan jeg altså der hvor jeg cather exception?
Avatar billede arne_v Ekspert
09. marts 2005 - 09:17 #8
ja
Avatar billede burningice Nybegynder
26. marts 2005 - 10:13 #9
nu har jeg prøvet at rode med det, og har fået det til at virke med at kalde abot på tråden, men indtil videre er det ikke blevet noget særlig pæn kode, da strukturen ikke lagde op til at jeg skulle gemme referencen til tråden klienten kører i. Men i kan da få lov at dele pointene.

Ikke at jeg er meget for at arne skal have endnu flere point i c#-kategorien, så indhenter jeg ham jo aldrig... men sådan er reglerne :P ;) hehe
Avatar billede arne_v Ekspert
26. marts 2005 - 10:35 #10
:-)
Avatar billede burningice Nybegynder
26. marts 2005 - 10:47 #11
det er jo fuldstændig grotesk... der er 26000 point fra nr 1 til nr 2 i denne kategori. Har du en masse små kineserbørn der sidder og svarer på spørgsmål i dit navn, og så kan de lige få en skål ris, om ugen, som tak?
Avatar billede arne_v Ekspert
26. marts 2005 - 11:04 #12
Næh - jeg er bare stabil - 2 svar om dagen er nok, hvis det er hver dag.

(har du checket Java og C/C++ kategorierne ?)
Avatar billede burningice Nybegynder
26. marts 2005 - 11:56 #13
ja... men nu tænkte jeg sådan set kun på denne kategori. Ved godt at hovedparten af dine point ikke kommer fra .Net kategorierne, men det forhindrer dig nu alligevel ikke i at ligge nr 1 i dem alle sammen, på nær asp.net.

Det er rigtig nok at man skal være aktiv over en lang periode. Men to svar om dagen er også mange, når man tager i betragtning hvor meget af tiden der egentlig går på snik-snak og kredsen rundt om problemet indtil man finder den rigtige løsning.
Avatar billede arne_v Ekspert
10. april 2005 - 18:03 #14
så mangler du bare at acceptere
Avatar billede burningice Nybegynder
10. april 2005 - 19:54 #15
well.. jeg ventede sådan set på et svar fra lifo ;)

jf. 26/03-2005 10:13:14 og at "i kan få lov at dele"

giver ham lige lidt ekstra tid til at svare
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester