Hej alla! Du har inte klarat av två trådar ens. Vad får dig att tro att du kan skriva en bättre webserver än IIS? :) Mitt tips är att lära dig använda background worker (Det finns mycket info om det om du söker på google).TcpListener problem
Jag håller på att skriva en liten server för att hantera Subscribe / Publish över http (Comet kallas det ofta)
Problemet är att TcpListenern vägrar att acceptera nya connections medans en connection redan bearbetas. Hur löser man detta? Min testkod ser utshär.
(Saxa in denna i en main metod om du vill testa)
Testa att i IE eller FF connecta till localhost (Eller den dator du kör testkoden på). Servern kommer inte serva nästa connection förrens den förra är klar (Allså efter 5 sekunder i detta fallet pga Thread.Sleep), detta duger inte då jag kommer ha flera tusen connections uppe samtidigt.
Om ni undrar varför jag inte använder IIS så beror det på att IIS klarar inte så många trådar samtidigt.
TcpListener listener = new TcpListener(80);
listener.Start(100);
while (true)
{
listener.BeginAcceptSocket(ar =>
{
Socket client = (ar.AsyncState as TcpListener).EndAcceptSocket(ar);
ThreadPool.QueueUserWorkItem(obj =>
{
Socket s2 = obj as Socket;
Console.WriteLine("Serving client");
int length = 0;
byte[] buffer = new byte[client.SendBufferSize];
length = client.Receive(buffer);
string request = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
string response = @"HTTP/1.1 200 OK
Cache-Control: private, s-maxage=0
Content-Type: text/plain; charset=utf-8
Expires: Mon, 31 May 2010 14:54:32 GMT
Server: Microsoft-IIS/7.0
X-AspNetMvc-Version: 2.0
X-AspNet-Version: 4.0.21006
X-Powered-By: ASP.NET
Date: Mon, 31 May 2010 14:54:32 GMT
Test";
UTF8Encoding encoding = new UTF8Encoding();
byte[] responeBytes = encoding.GetBytes(response);
Thread.Sleep(5000);
s2.Send(responeBytes);
s2.Close();
}, client);
}, listener);
}
Sv: TcpListener problem
Det finns många problem här, t.ex. din första client är ju inte trådad. Och du ska inte tråda varje klient, det håller inte (om du ska klara tusentals).
Du behöver parsa HTTP strömmar. TCP ger dig bara en ström av bytes, inte färdiga HTTP-paket. Du har blandat ASCII och UTF8. Jag kan bara råda dig att dra nytta av IIS eller ngn annan webserver, du är inte mogen att uppfinna det hjulet igen. Sv: TcpListener problem
Gör sedan på så vis att du skapar en background worker, som sitter och lyssnar på tcp-anslutningar (med förslagsvis tcplistener), i sin egna tråd.
När den fått en anslutning ska du t.ex. sätta backgroundworkerns e.Result till den nya tcp-klienten som anslutit, och fånga upp det genom backgroundworkerns event "RunWorkerCompleted". Då är du tillbaka till din första tråd, och där i kan du starta om backgroundworkern (det blir alltså en rekursiv kod), och göra vad du vill göra med e.Result, som nu är anslutningen till klienten som anslöt.
Förenklat blir det så här:
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
bg.RunWorkerAsync();
void bg_DoWork(object sender, DoWorkEventArgs e)
{
// Skapa en listener som lyssnar på anslutning
e.Result = // tcp-anslutningen
}
void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
((BackgroundWorker)sender).RunWorkerAsync();
// Gör vad du vill med e.Result
}
Hoppas det var till hjälp!