Avatar billede webcreator Nybegynder
09. august 2005 - 18:44 Der er 20 kommentarer og
1 løsning

Chat - Sockets og Streams

Hej Eksperter.

Jeg er på 3. semester af datamatiker-studiet blevet præsenteret for Sockets. I den forbindelse sidder jeg og leger lidt med det på hjemmefronten. Jeg kunne godt tænke mig at lave en simpel, lille chat, der jo ganske glimrende demonstrerer brugen af Sockets. Jeg er dog stødt ind i nogle problemer :

1) Min server kører i en tråd. Hvis jeg lukker programmet, mens jeg afventer en klient på en lytte-socket, så dør min tråd ikke. Jeg kunne derfor godt tænke mig en metode til at lukke mine sockets - også selv om de står og venter med fx Accept().

2) Samme problem gør sig gældende for NetworkStreams. Jeg har en streamWriter som læser fra min Network Stream. Når jeg kalder metoden ReadLine() på denne, står min tråd igen afventende, og kan ikke lukkes med Close().

Jeg håber I har nogle forslag til, hvordan jeg kan løse dette problem - på forhånd tak :)
Avatar billede arne_v Ekspert
09. august 2005 - 18:47 #1
Prøv at kalde:

Environment.Exit(0);
Avatar billede arne_v Ekspert
09. august 2005 - 18:48 #2
Ellers bør du også kunne kalde Interrupt på trådene (forudsætter naturligvis
at du stadig har en reference til dem)
Avatar billede nielle Nybegynder
09. august 2005 - 18:48 #3
Ad 1) Den pæne måde at gøre det på, er at serveren sender en besked til klienten om at lukke sig selv ned, før at den lukker sin socket.
Avatar billede webcreator Nybegynder
09. august 2005 - 18:53 #4
Tak for jeres input.

Arne > Det ser ud til at virke, men det er vel næppe, som Nielle også siger, en ret pæn måde at gøre det på ?

Nielle > Det gjorde jeg i en tidligere version af den. Men hvis jeg nu ønsker at lukke serveren ned, hvad gør jeg så? Så er jeg afhængig af at en klient kan lukke den ned. Og hvis klienten går ned, så kan serveren ikke lukkes.
Avatar billede arne_v Ekspert
09. august 2005 - 18:57 #5
Brug Interrupt.

Du kan ikke stole på at klienter lukkes pænt ned.
Avatar billede webcreator Nybegynder
09. august 2005 - 19:12 #6
Ok, fornemt. Jeg prøvede Environment-tingen før - prøver lige interrupt i stedet. Jeg vender dog først tilbage om et par timer. Skal lige hjælpe noget familie med lidt flyttearbejde :)
Avatar billede nielle Nybegynder
09. august 2005 - 19:48 #7
Nej, man kan aldrig stole på at noget lukker pænt ned - men derfor er det nu som regel en del af en velformet protokol at der er en eller anden slags "Farvel" kommando
Avatar billede webcreator Nybegynder
09. august 2005 - 20:27 #8
Thread.interrupt() slår ikke tråden ihjel hos mig - hvad kan jeg så gøre ?
Avatar billede webcreator Nybegynder
09. august 2005 - 20:28 #9
Selve tråden :

serverThread = new Thread(new ThreadStart(server.Start));
serverThread.Start();

Terminering af tråden (virker ikke - IsAlive returnerer TRUE) :

serverThread.Interrupt();
MessageBox.Show("Server-tråd i live:" + serverThread.IsAlive.ToString());
Avatar billede arne_v Ekspert
09. august 2005 - 20:28 #10
du kalder:

dinclientthreadobject.Interrupt();

ikke ?
Avatar billede arne_v Ekspert
09. august 2005 - 20:31 #11
og

serverThread.Interrupt();
serverThread.Join();

får den ikke til at slutte ?
Avatar billede arne_v Ekspert
09. august 2005 - 20:31 #12
og du catcher ikke interrupted exception i din tråd vel ?
Avatar billede webcreator Nybegynder
09. august 2005 - 20:34 #13
Jeg vil lige slå fast, at jeg ikke er ved at lave klienten endnu. Indtil videre er det kun en server. Jeg har noget test-kode der fungerer som klient indtil videre.

Følgende fik min applikation til at fryse :

serverThread.Interrupt();
serverThread.Join();
Avatar billede webcreator Nybegynder
09. august 2005 - 20:34 #14
Oh nej, jeg catcher ikke interrupted exceptions :)
Avatar billede webcreator Nybegynder
09. august 2005 - 20:41 #15
På klassen har jeg i øvrigt tråd-referencen :

Thread serverThread;

Og selve serveren : http://powerzone.dk/code.cs
Avatar billede arne_v Ekspert
09. august 2005 - 20:55 #16
hm

jeg har lige selv prøvet

og hverken Interrupt eller Abort kan tilsyneladende føre noget
ved en tråd som står i Accept

den afbrydes først ud når en connection etableres

hmmmm
Avatar billede webcreator Nybegynder
09. august 2005 - 21:11 #17
Yep, lige præcis. Ser ud til, at løsningen måske er at skabe en ny socket, og lade denne connecte til den socket vi ønsker at lukke.
Avatar billede webcreator Nybegynder
09. august 2005 - 21:26 #18
Jeg vrøvler vist. Der er jo allerede etableret en forbindelse..
Avatar billede Syska Mester
11. august 2005 - 17:11 #19
lytter med...
Avatar billede webcreator Nybegynder
29. august 2005 - 10:27 #20
Arne > Smider du et svar? Lukker
Avatar billede arne_v Ekspert
29. august 2005 - 10:30 #21
ok
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