mmofacts.com

Simpler HTTP-Server in C#

gepostet vor 16 Jahre, 9 Monate von None
Also, mein Vorhaben sieht folgendermaßen aus: Ich möchte einen einfachen HTTP-Server in C# schreiben, worin ich auch gleich mein Spiel integrieren möchte. Somit kann dann alle optimal zusammenspielen und ich liefere einfach die entsprechenden Seiten an den User aus. Rohstoffberechnung usw. kann dann schön Multithreaded ausgeführt werden. Der Server sollte zumindestens das können was in der RFC 2616 (HTTP/1.1) (schon ausgedruckt und in einer Mappe geordnet) als MUST definiert ist. Nur fehlen mir die Ansätze wie ich in C# den Server programmieren soll. Vielleicht kennt ihr einige Lösungen?
Gruß Patrik
gepostet vor 16 Jahre, 9 Monate von TheUndeadable
Such mal nach HttpListener.
Mit dem hast du in 10 Zeilen-Code einen eigenen HTTP-Webserver.
gepostet vor 16 Jahre, 9 Monate von Fornax
Ein Freund von mir hat für ein RPG-Onlinegame eine nützliche DLL für TCP/IP-Verbindungen geschrieben. Diese nutze ich auch für meinen HTTP-Server.
Für das Beispiel habe ich das wichtigste rauskopiert. Es kann leider sein, dass ich was vergessen habe, oder zu viel unnötiges kopiert habe. Ich hoffe, ihr blickt da durch.
ChaosNetServer.dll
ChaosNetServerExample.cs
ChaosNetServerExample.exe
EDIT:
Meine Lösung ist eher, wenn du dich noch mit dem HTTP-Protokoll auseinandersetzen willst. Ich habe deine Frage anscheinend beim ersten lesen nicht richtig gelesen, guck mal lieber nach dem Vorschlag von TheUndeadable.
gepostet vor 16 Jahre, 9 Monate von None
Original von TheUndeadable
Such mal nach HttpListener.
Mit dem hast du in 10 Zeilen-Code einen eigenen HTTP-Webserver.

Danke TheUndeadable. Und laut Mono Release Notes ist die HttpListener klasse auch in Mono verfügbar.
gepostet vor 16 Jahre, 9 Monate von None
Ich wollt hier mal meine Http.cs posten. Vielleicht kann ja TheUndeadable sie sich mal anschauen und sagen, was man noch verbessern, ändern könnte.
Http.cs
Edit: XmlDoc Kommentare hinzugefügt.
gepostet vor 16 Jahre, 9 Monate von TheUndeadable
rafb.net/p/TUZHNw96.html
Ein paar Kommentare...
Insbesondere verstehe ich nicht warum du den Threadpool zuballerst.
NACHTRAG:
~Http heißt in der .Net-Sprache 'Finalisierer' und Destruktor. Zwischen Destruktoren und Finalisierern besteht ein großer Unterschied:
Destruktoren werden sofort beim Verlassen des Scopes (oder beim Entfernen aus dem Heap aufgerufen). Finalisierer werden IRGENDWANN aufgerufen!
gepostet vor 16 Jahre, 9 Monate von None
So, hab mir nun deine Kommentare zu Herzen genommen.
gepostet vor 16 Jahre, 9 Monate von None
Original von TheUndeadable
Finalisierer werden IRGENDWANN aufgerufen!

Quasi der Pendant vom Java-Dekonstruktor :p
Wobei bei Java nichtmal garantiert ist, dass er überhaupt aufgerufen wird (laut Sun Developer Network). Weisst du zufällig wofür solche Konstrukte gut sein sollen? Hat mir bisher noch niemand sagen können
gepostet vor 16 Jahre, 9 Monate von DrakeL
Original von SamsonWeisst du zufällig wofür solche Konstrukte gut sein sollen? Hat mir bisher noch niemand sagen können

Meinst du Destruktoren allgemein, oder die von Java, welche nicht garantiert aufgerufen werden?
Allgemein: Freigeben von Ressourcen, wie Datenbankverbindungen oder Dateizeiger. Somit muss der Entwickler nie selbst solche Ressourcen freigeben.
Java (und auch PHP): Letzte Sicherheit zum freigeben von Ressourcen. Standardmäßig bietet eine Klasse Methoden an zum freigeben von Ressourcen, wo der Entwickler genau bestimmen kann, wann er die Ressourcen freigeben will. Der Destruktor hat nur die Aufgabe die Ressourcen freizugeben, falls der Entwickler dies wirklich mal vergessen hat.
Beides hat Vor- und Nachteile. Aber eine andere Bedeutung haben Destruktoren doch eigentlich nie gehabt als Ressourcen freigeben.
gepostet vor 16 Jahre, 9 Monate von None
Original von DrakeL
Java (und auch PHP): Letzte Sicherheit zum freigeben von Ressourcen. Standardmäßig bietet eine Klasse Methoden an zum freigeben von Ressourcen, wo der Entwickler genau bestimmen kann, wann er die Ressourcen freigeben will. Der Destruktor hat nur die Aufgabe die Ressourcen freizugeben, falls der Entwickler dies wirklich mal vergessen hat.

Das macht eben in Java keinen Sinn. Wenn der GC drüber läuft ist es meist viel zu spät um irgendwas freizugeben
Und wenn gerade der Speicherbedarf bzw. die Prozessorleistung zu hoch ist, wird der Destruktor schlichtweg ignoriert. Dementsprechend hat es wenig Sinn da irgendwas sinnvolles reinzuschreiben. Nicht umsonst nutzt das unter Java niemand...
Wobei ein Finaliser da auch wenig Sinn macht: Ressourcenfreigabe irgendwann ist untragbar in einem Programm. Zumal ich es ja ohne weiteren Aufwand vorziehen kann...
Der Java Destruktor hat nichts mit dem Standard C-Destruktor zu tun.
gepostet vor 16 Jahre, 9 Monate von Agmemon
Ich habe auch noch keinen wirklichen Einsatzzweck für die finalize() Methode in Java gefunden. Der Hintergrund hinter der Methode war/ist es es, dort sicherzustellen, dass nicht Java-Ressourcen freigegeben werden können. Also so eine Art Sicherheitsleine, um z.B. noch einen Flush auf Dateien zu machen, oder Sie explizit zu schliessen.
Ansonsten kann die Methode noch ganz interessant sein, wenn man den Lebenszyklus von Objekten überwachen möchte, z.B. beim Profiling.
gepostet vor 16 Jahre, 9 Monate von None
Ich hab mal meine Projektmappe gepackt. TheUndeadable, vielleicht kannst du dir den Code mal ansehen und schaun was verbessurngswürdig ist und so.
Abimus Source
gepostet vor 16 Jahre, 9 Monate von Amun Ra
Das Forum hier ist scheisse ! Posting wieder mal weg !
Kurzfassung:
Wie performant ist dein Server ?
Schon mal ein Benchmark gemacht ?
Lust das mal zu machen und die Ergbnisse zu posten ?
Schreibe auch gerade an einem in C um meinen Horizont zu erweitern.
gepostet vor 16 Jahre, 9 Monate von None
Benchmark hab ich noch nicht gemacht. Nach dem Start braucht er für die erste Seite ein bisschen, aber danach kommen die restlichen Seiten wie geschmiert. Aber dieses Phänomen hab ich auch bei meinen Apache, der was lokal läuft.
gepostet vor 16 Jahre, 9 Monate von TheUndeadable
Ich finde die Aufteilung in partielle Klassen etwas ungewöhnlich. Kann mir vorstellen, dass die Klasse bei vielen Seiten etwas überfüllt ist.
Ansonsten achte darauf, dass die Klasse threadsafe ist.
gepostet vor 16 Jahre, 9 Monate von None
Ich hab die Klasse Site auf partielle Klassen aufgeteilt, damit ich nicht alle Seiten in einer Datei habe.
Wie bekomm ich die Klasse den threadsafe?
gepostet vor 16 Jahre, 9 Monate von TheUndeadable
Ja, dass du die Klasse auf Dateien aufgeteilt hast, das habe ich gesehen, nur befürchte ich eine Überladung der Klasse, falls du dort Klassenvariablen anlegst oder ähnliches.
Threadsafe ist eine Sache, wenn du zwei beliebige Methoden einer Klasse aufrufen kannst, ohne dass gleichzeitig auf gleiche Variablen schreibend bzw lesend und schreiben zugegriffen wird.
Ansonsten kannst du dir den C#-Befehl 'lock' mal anschauen.
gepostet vor 16 Jahre, 9 Monate von Amun Ra
Mmh schade, das hätte mich doch mal sehr interessiert.
Vielleicht kannst du das doch mal in Angriff nehmen ?!
Mit Apache Benchmark geht das sehr bequem.
Einfach mal testen wie schnell er im Schnitt
eine statische 20 Kb Seite ausliefern kann im Vergleich zum Apache.
gepostet vor 16 Jahre, 9 Monate von TheUndeadable
Wobei man beim HttpListener stark zwischen Windows und Linux unterscheiden muss.
Unter Windows wird er auf Kernel-Ebene parallel zum evtl vorhandenen IIS eingebunden (beide teilen sich dann den Port 80).
gepostet vor 16 Jahre, 9 Monate von None
Original von Amun Ra
Einfach mal testen wie schnell er im Schnitt
eine statische 20 Kb Seite ausliefern kann im Vergleich zum Apache.

Das ist ja ein kleines Problemchen, da ich keine statischen Seiten ausliefere, sondern der ganze Content dynamisch im Server (nicht in der dll, aber in dem Programm, welche die dll einbindet) generiert wird.

Auf diese Diskussion antworten