Keskustelut - Visual Basic / C# / .NET - Palvelin käsittelemään useita pyyntöjä


Silvertigo 17:13 7.11.10 
Olen tehnyt yksinkertaisen www-palvelimen wpf-sovelluksena. Palvelin toimii sinällään hyvin, mutta se osaa käsitellä vain yhden pyynnön. Se siis tekee mitä haluankin ensimmäisellä kerralla, mutta kun päivitän sivuani se jää vain lataamaan, kyseessä on asynkroninen palvelin. Miten saisin palvelimen käsittelemään useita pyyntöjä? Vastaus pitäisi kai löytyä TcpListener:in BeginAcceptTcpClient metodista, mutta en ole sitä löytänyt. Osaisiko joku auttaa?
weicco 21:12 7.11.10 
http://wiki.mureakuha.com/wiki/Weicon_socket-tutoriaali_osa_2

Tuolla on juttua palvelimen tekemisestä C:llä. Pienellä soveltamisella se onnistuu myös C#/.NET:llä.

Idea on, että luot ensin Socket olion, jonka bindaat ja laitat "listen" tilaan. Tämän jälkeen luot n+1 kpl threadeja, jotka jäävät pörräämään ikilooppiin. Loopissa ekana kutsut Accept metodia, joka antaa sinulle asiakaskohtaisen socketin. Liitä sockettiin NetworkStream ja hanskaa HTTP kutsu. Lopuksi sulje asiakassocket ja palaa Acceptiin.

En jaksa näin myöhään kirjoittaa esimerkkikoodia, mutta yritän huomenna väsätä jotain.
Silvertigo 10:40 8.11.10 
Kiitos vastauksestasi tuo oli sinällään jo erittäin hyödyllinen, että se sai minut ajattelemaan koodiani eri näkökulmasta. Minulla lukee Window_loaded eventissä seuraavasti:

C#
TcpListener server = new TcpListener(address.AddressList[0], 8000);
server.Start();
server.BeginAcceptTcpClient(new AsyncCallback(serverCallBack), server);
 


Kitos viestisi keksin laittaa serverCallBack-metodin kutsumaan rekursiivisesti itseään, joten nyt lataus toimii.


C#
        public void serverCallBack(IAsyncResult Ar)
        {
               ...
                server.BeginAcceptTcpClient(new AsyncCallback(serverCallBack), server);
            }
 


Koska en ole aikaisemmin verkko-ohjelmointia harrastanut halusin pysyä TcpListener:issä enkä vielä mennä sokettiohjelmoinnin pariin. Netistä, kun olen lukenut, että se on haastavampaa. Erittäin mielenkiinnolla kyllä katsoisin, miten se soketeilla luonnistuu, jos jaksat koodin laittaa :). Jotain voisi siitä oppia.
weicco 12:20 8.11.10 
Ai joo. Unohdin noi asynkroniset kutsut. Ne ovat itseasiassa parempi tapa toteuttaa asia kuin tuo minun wikipaskeessa oleva thredaus.