10. april 2006 - 15:10Der er
11 kommentarer og 1 løsning
socket i .NET
Jeg er ved at kode et program som skal køre på en server win2k. Det skal bl.a. lytte efter socket-forbindelser fra nogle klienter, og besvare dem.
Eksempelvis kunne der lyttes med en TcpListener, som i nedenstående kode:
TcpListener tcpServerListener = new TcpListener(4445); tcpServerListener.Start(); Socket serverSocket = tcpServerListener.AcceptSocket();
Kode-afviklingen stopper altså indtil der kommer en socket forespørgsel.
Derfor skal denne del vel over i en seperat tråd, og når der endelig kommer en forespørgsel skal denne håndteres af endnu en tråd, således at der ikke blokeres for flere tråde.
Skal jeg selv implementere alt dette i .NET, eller indeholder .NEt en smårt måde at gøre dette på?
jeg har netop fundet denne side som beskriver hvordan det kan gøres asynkront, uden at man skal håndtere tråde. Men jeg er endnu ikke færdig med at læse den
Løsningen afhænger vel også af det forventede/faktiske brugsmønster. Oprettes og nedlægges forbindelser hele tiden kan det være tungt at oprette nye tråde hver gang. Er det arbejde der skal udføres tungt og/eller tidskrævende. Hvis arbejdet er hurtigt overstået kan man fx bruge ThreadPool'en til udføre arbejdet. Er antallet af samtidige forbindelser stort er det måske også en dårlig ide med separate tråde til hver, da windows så kan bruge urimeligt meget tid på skedulering.
Du kan også bruge en kø: For hver besked du modtager fra socket'en placerer du et objekt i en kø, så har du en anden tråd der afkøer fra køen, behandler requesten og sender svaret retur. (det mønster bruger jeg somme tider. Kræver selvf lige at man overvejer trådsikring af køen, rækkefølgeproblematikker mv).
Jeg har omkring 100 - 200 clienter tilsluttet, så det kan som tuxic siger godt være lidt tungt. Jeg vil lige overveje muligheden med kø'er som du beskriver. Kan du henvise til nogle sider med eksempler på sådan en kø-socket-implementering?
Vedrørende codeproject artiklen har jeg ikke set på koden i detaljer. Nogle af kommentarene kunne indikere problemer fx omkring af klienter der dør. Men som altid, man skal ikke ukritisk tro på alt fra nettet. (Ting jeg skriver er naturligvis en undtagelse ;))
Jeg valgte selv at kode min tråd asynkront. Der var flere ting der skulle tages højde for. Herunder at sørge for at den samme socket ikke blev brugt af flere tråde samtidigt. Tak for kommentarerne.
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.