Avatar billede maqhem Nybegynder
22. januar 2008 - 15:40 Der er 14 kommentarer og
3 løsninger

Tilgå alle klienter

Jeg har set et genialt svar fra arne_v i følgende spørgsmål:

http://www.eksperten.dk/spm/708874

Problemet er jo bare, at jeg ikke kan få det til at du. Det er jo tyspisk, og så må man spørge selv. Hvordan får jeg implementeret samme SendToAll-metode i min egen kode? Som I kan se, har jeg forsøgt ved at lave en separat klasse til min ArrayList, men jeg får fejl i denne linje:

this.ClientStream.Write(SendBytes, 0, SendBytes.Length);

Den smider en NullReferenceException. Hvorfor det? Og hvordan retter jeg det?
I kan se hele koden på http://exp.maqhem.com/csharp.txt (for ikke at fylde for meget på eksperten).

Hvis min kode er tudegrim, så må I gerne kommentere på det på en konstruktiv måde, for jeg er ikke så skarp til C# endnu.

Grunden til, jeg gemmer sidste karakter CCiffer, er fordi jeg arbejder med Flash som min klient, og Flash har det med ikke at ville sende eller modtage data, hvis der ikke er påklistret et sådan tegn i enden.
Desuden kan jeg ikke bare copy/pase arne_v's svar, for Flash er af en mærkelig grund ikke så god til StreamReader og StreamWriter.
Avatar billede Syska Mester
22. januar 2008 - 23:57 #1
Ikke at jeg har kigget det hele igennem ...

Men du siger:
this.ClientStream.Write(SendBytes, 0, SendBytes.Length);

Giver en null exception ...

Mon ikke at ClientStream så også er null ...

Sikker på du får opretet en instance og smidt den ned i ClientStream ?

// out

p.s: når du navngiver en member variable "ClientStream" minder det om en klasse ... jeg ville kalde den "clientStream" eller "_ClientStreaM" eller "f_ClientStream" ...

For at indikere at det en er lokal i forhold til klassen ...
Avatar billede jeppekristensen Nybegynder
23. januar 2008 - 01:14 #2
Hej jeg kiggede på din kode. Din metode til SendToAll er static. Hvis du fjerner static er jeg rimelig sikker på at dit kode burde virke. Når den er statisk kan den ikke tilgå arraylisten fordi den er dynamisk.

Jeg håber at det får det til at virke.
Avatar billede arne_v Ekspert
23. januar 2008 - 04:36 #3
Jeg tror at buzzzz har ret.

Problemet er formentligt at du adder client til din liste *inden* client accepterer
en connection.
Avatar billede arne_v Ekspert
23. januar 2008 - 04:40 #4
Koden i 708874 er ikke genial.

Det er faktisk ret primitiv kode.

Men der er en grund til at tingene bliver gjordt i en bestemt rækkefølge på en bestemt måde.

Jeg adder efter at have acceptet connection.

Du har også fjernet lock.

Det vil give dig problemer på et tidspunkt.
Avatar billede maqhem Nybegynder
23. januar 2008 - 07:55 #5
Hvad betyder lock overhovedet? Jeg har været ved at læse om det, men jeg forstår det ikke helt.
Avatar billede maqhem Nybegynder
23. januar 2008 - 07:58 #6
Og til det, buzzzz siger, så giver det altså ikke fejl, hvis jeg kalder Send fra en instans af Client. Så den er jo ikke null.
Avatar billede jeppekristensen Nybegynder
23. januar 2008 - 10:16 #7
Har du prøvet det jeg foreslog? Din Send metode er ikke static:
public void Send(string Message, string End)

hvorimod din send all er static:
public static void SendToAll(string Message, string End)

Så det burde virke hvis du fjerner static:
public void SendToAll(string Message, string End)
Avatar billede maqhem Nybegynder
23. januar 2008 - 13:29 #8
Tak, den static var en rest fra noget tidligere ekspermenteren. Men jeg har løst det nu, og hør hér hvordan:

Hvis jeg outputter Clients.Array.Length er den hele tiden en mere, end det antal klienter, der er tilsluttet, og nu ved jeg hvorfor. Når jeg adder min Client til Clients.Array, er klienten jo ikke tilsluttet - det bliver den først i Run, når min klient rent faktisk opretter forbindelse. Derfor har jeg hele tiden en ikke-tilsluttet klient i min ArrayList, og så er det da klart, at min NetworkStream er null.

Så jeg har flyttet min add ned under deklareringen af min NetworkStream i metoden Run, da den så først tilføjes, når der kan oprettet forbindelse.

Så faktisk kom svaret fra buzzzz, selvom jeg ikke lige havde fanget hvorfor, den skulle være null, men det har jeg nu. Så tak til jer alle sammen. Både buzzzz og arne_v kan smide et svar hver, så får I alle sammen point for jeres entusiasme :)
Avatar billede maqhem Nybegynder
23. januar 2008 - 14:00 #9
Og hvis én af jer vil komme med en "ubetalt" kommentar til min kode, er den mere end velkommen. Jeg har ikke kodet C# længe nok til at kende god syntaks og flot kode endnu.
Avatar billede arne_v Ekspert
23. januar 2008 - 15:02 #10
lock synkroniserer adgangen - her er den noedvendig for at undgaa at flere klienter
laver en send to all samtidigt og at de writes bliver "rodet sammen"
Avatar billede maqhem Nybegynder
23. januar 2008 - 15:27 #11
Så hver eneste gang, jeg laver noget, der kan ske at blive gjort to gange samtidig, skal jeg sætte en lock omkring? Og hvad skal jeg skrive som parameter til min lock i så fald?
Avatar billede arne_v Ekspert
24. januar 2008 - 02:52 #12
Nej.

Kun hvis de kan konflikte med hinanden.

Det kan i det her tilfælde.

Lad os forstille os 3 brugere A, B og C.

A sender "foo" til alle

B sender "bar" til alle

alle inkluderer C d.v.s. at begge skal sende til C

A's client handler skriver "Fra A: foo" på C's socket
B's client handler skriver "Fra B: bar" på C's socket

virker fint, men uden lock kan følgende ske:

A's client handler skriver "Fra A: " på C's socket
B's client handler skriver "Fra B: bar" på C's socket
A's client handler skriver "foo" på C's socket

Derfor lock.
Avatar billede arne_v Ekspert
24. januar 2008 - 02:53 #13
Og et svar
Avatar billede maqhem Nybegynder
24. januar 2008 - 08:05 #14
Tak. Jeg læste lidt om threads på http://www.albahari.com/threading/ i går, hvis andre nye C#-kodere skulle lytte med på spørgsmålet.

Hvis du, buzzzz, vil have nogle point, må du smide et svar.
Avatar billede Syska Mester
24. januar 2008 - 17:21 #15
svar ...

// ouT
Avatar billede Syska Mester
24. januar 2008 - 17:21 #16
prøver lige igen :-)
Avatar billede maqhem Nybegynder
24. januar 2008 - 17:41 #17
Og tak for hjælpen alle sammen.
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