suchen
HeimBackend-EntwicklungC#.Net-TutorialC# implementiert den einfachsten HTTP-Server

C# implementiert den einfachsten HTTP-Server

Nov 24, 2016 am 11:48 AM
c#http服务器

Einführung

Dieser Artikel verwendet C#, um die einfachste HTTP-Serverklasse zu implementieren. Sie können sie in Ihr eigenes Projekt einbetten oder den Code lesen, um mehr über das HTTP-Protokoll zu erfahren.

Hintergrund

Hochleistungs-WEB-Anwendungen werden im Allgemeinen auf leistungsstarken WEB-Servern wie IIS, Apache und Tomcat erstellt. Allerdings ist HTML eine sehr flexible UI-Markup-Sprache, was bedeutet, dass jede Anwendung und jeder Back-End-Dienst Unterstützung für die HTML-Generierung bieten kann. In diesem kleinen Beispiel verbrauchen Server wie IIS und Apache zu viele Ressourcen. Wir müssen selbst einen einfachen HTTP-Server implementieren und ihn in unsere Anwendung einbetten, um WEB-Anfragen zu verarbeiten. Wir brauchen nur eine Klasse, um es zu implementieren, es ist sehr einfach.

Code-Implementierung

Sehen wir uns zunächst die Verwendung von Klassen an und analysieren dann die spezifischen Details der Implementierung. Hier erstellen wir eine Klasse, die von HttpServer erbt und die beiden abstrakten Methoden handleGETRequest und handlePOSTRequest implementiert:

public class MyHttpServer : HttpServer {
    public MyHttpServer(int port)
        : base(port) {
    }
    public override void handleGETRequest(HttpProcessor p) {
        Console.WriteLine("request: {0}", p.http_url);
        p.writeSuccess();
        p.outputStream.WriteLine("<html><body><h1 id="test-nbsp-server">test server</h1>");
        p.outputStream.WriteLine("Current Time: " + DateTime.Now.ToString());
        p.outputStream.WriteLine("url : {0}", p.http_url);
 
        p.outputStream.WriteLine("<form method=post action=/form>");
        p.outputStream.WriteLine("<input type=text name=foo value=foovalue>");
        p.outputStream.WriteLine("<input type=submit name=bar value=barvalue>");
        p.outputStream.WriteLine("</form>");
    }
 
    public override void handlePOSTRequest(HttpProcessor p, StreamReader inputData) {
        Console.WriteLine("POST request: {0}", p.http_url);
        string data = inputData.ReadToEnd();
 
        p.outputStream.WriteLine("<html><body><h1 id="test-nbsp-server">test server</h1>");
        p.outputStream.WriteLine("<a href=/test>return</a><p>");
        p.outputStream.WriteLine("postbody: <pre class="brush:php;toolbar:false">{0}
", data);     } }

Wenn wir mit der Verarbeitung einer einfachen Anfrage beginnen, müssen wir einen separaten Thread starten, um einen Port abzuhören, z Port 8080:

HttpServer httpServer = new MyHttpServer(8080);
Thread thread = new Thread(new ThreadStart(httpServer.listen));
thread.Start();

Wenn Sie dieses Projekt kompilieren und ausführen, sehen Sie den generierten Beispielinhalt auf der Seite unter der Browseradresse http://localhost:8080. Werfen wir einen kurzen Blick auf die Implementierung dieser HTTP-Server-Engine.

Dieser WEB-Server besteht aus zwei Komponenten. Eine davon ist die HttpServer-Klasse, die dafür verantwortlich ist, TcpListener zu starten, um den angegebenen Port abzuhören, und die Methode AcceptTcpClient() verwendet, um TCP-Verbindungsanforderungen in einer Schleife zu verarbeiten Schritt bei der Verarbeitung von TCP-Verbindungen. Dann kommt die Anfrage am „angegebenen“ Port an und es wird ein neues Portpaar erstellt, um die TCP-Verbindung vom Client zum Server zu initialisieren. Dieses Portpaar ist die Sitzung von TcpClient, sodass unser Hauptport weiterhin neue Verbindungsanfragen empfangen kann. Aus dem folgenden Code können wir ersehen, dass jedes Mal, wenn der Listener einen neuen TcpClien erstellt, die HttpServer-Klasse einen neuen HttpProcessor erstellt und dann einen Thread für den Betrieb startet. Die HttpServer-Klasse enthält außerdem zwei abstrakte Methoden, die Sie implementieren müssen.

public abstract class HttpServer {
 
    protected int port;
    TcpListener listener;
    bool is_active = true;
 
    public HttpServer(int port) {
        this.port = port;
    }
 
    public void listen() {
        listener = new TcpListener(port);
        listener.Start();
        while (is_active) {               
            TcpClient s = listener.AcceptTcpClient();
            HttpProcessor processor = new HttpProcessor(s, this);
            Thread thread = new Thread(new ThreadStart(processor.process));
            thread.Start();
            Thread.Sleep(1);
        }
    }
 
    public abstract void handleGETRequest(HttpProcessor p);
    public abstract void handlePOSTRequest(HttpProcessor p, StreamReader inputData);
}

Auf diese Weise wird eine neue TCP-Verbindung von HttpProcessor in einem eigenen Thread verarbeitet. Die Aufgabe von HttpProcessor besteht darin, den HTTP-Header korrekt zu analysieren und die korrekt implementierte abstrakte Methode zu steuern. Werfen wir einen Blick auf die Verarbeitung von HTTP-Headern. Die erste Codezeile für die HTTP-Anfrage lautet wie folgt:

GET /myurl HTTP/1.0

Nachdem die Eingabe und Ausgabe von Process() festgelegt wurde, ruft HttpProcessor auf parseRequest( )-Methode.

public void parseRequest() {
    String request = inputStream.ReadLine();
    string[] tokens = request.Split(&#39; &#39;);
    if (tokens.Length != 3) {
        throw new Exception("invalid http request line");
    }
    http_method = tokens[0].ToUpper();
    http_url = tokens[1];
    http_protocol_versionstring = tokens[2];
 
    Console.WriteLine("starting: " + request);
}

Die HTTP-Anfrage besteht aus drei Teilen, daher müssen wir sie nur mit der Methode string.Split() in drei Teile aufteilen. Der nächste Schritt besteht darin, die HTTP-Anfrage zu empfangen und zu analysieren Header von den Client-Informationen, jede Datenzeile in den Header-Informationen wird in Form eines Schlüsselwerts (Schlüsselwert) gespeichert. Eine leere Zeile zeigt das Ende der HTTP-Header-Informationen an Lesen Sie die HTTP-Header-Informationen:

public void readHeaders() {
    Console.WriteLine("readHeaders()");
    String line;
    while ((line = inputStream.ReadLine()) != null) {
        if (line.Equals("")) {
            Console.WriteLine("got headers");
            return;
        }
 
        int separator = line.IndexOf(&#39;:&#39;);
        if (separator == -1) {
            throw new Exception("invalid http header line: " + line);
        }
        String name = line.Substring(0, separator);
        int pos = separator + 1;
        while ((pos < line.Length) && (line[pos] == &#39; &#39;)) {
            pos++; // 过滤掉所有空格
        }
 
        string value = line.Substring(pos, line.Length - pos);
        Console.WriteLine("header: {0}:{1}",name,value);
        httpHeaders[name] = value;
    }
}

An diesem Punkt haben wir gesehen, wie mit einfachen GET- und POST-Anfragen umgegangen wird, die jeweils den richtigen Handlern zugewiesen sind. In diesem Beispiel gibt es ein heikles Problem, das beim Senden von Daten gelöst werden muss, nämlich dass die Anforderungsheaderinformationen die Längeninformationen der gesendeten Daten enthalten. Wenn wir hoffen, dass die handlePOSTRequest-Methode in der Unterklasse HttpServer ist Wenn wir die Daten korrekt verarbeiten können, müssen wir die Informationen zur Datenlänge und Inhaltslänge zusammen in den Datenstrom einfügen. Andernfalls wird der Absender blockiert und wartet auf Daten, die niemals ankommen. Wir verwenden eine weniger elegante, aber sehr effektive Methode, um mit dieser Situation umzugehen, nämlich die Daten in einen MemoryStream einzulesen, bevor sie an die POST-Verarbeitungsmethode gesendet werden. Dieser Ansatz ist aus folgenden Gründen nicht ideal: Wenn die gesendeten Daten groß sind oder sogar eine Datei hochgeladen wird, ist es für uns nicht angemessen oder überhaupt nicht möglich, die Daten im Speicher zwischenzuspeichern. Die ideale Methode besteht darin, die Länge des Beitrags zu begrenzen. Beispielsweise können wir die Datenlänge auf 10 MB begrenzen.

Eine weitere Vereinfachung dieser einfachen Version des HTTP-Servers ist der Rückgabewert von content-type. Im HTTP-Protokoll sendet der Server immer den MIME-Typ der Daten an den Client und teilt dem Client mit, welchen Typ er haben muss Daten erhalten. In der Methode writeSuccess() sehen wir, dass der Server immer den Typ text/html sendet. Wenn Sie andere Typen hinzufügen müssen, können Sie diese Methode erweitern.


Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
C# .NET -Entwicklung: Ein Anfängerleitfaden zum EinstiegC# .NET -Entwicklung: Ein Anfängerleitfaden zum EinstiegApr 18, 2025 am 12:17 AM

Um die C# .NET -Entwicklung zu starten, müssen Sie: 1. Verstehen Sie das Grundkenntnis von C# und die Kernkonzepte des .NET -Frameworks; 2. Meister Sie die grundlegenden Konzepte von Variablen, Datentypen, Kontrollstrukturen, Funktionen und Klassen; 3.. 4. Mit Debugging -Techniken und Leistungsoptimierungsmethoden für häufige Fehler vertraut sein. Mit diesen Schritten können Sie nach und nach in die Welt von C#.NET eindringen und effiziente Anwendungen schreiben.

C# und .net: Verständnis der Beziehung zwischen den beidenC# und .net: Verständnis der Beziehung zwischen den beidenApr 17, 2025 am 12:07 AM

Die Beziehung zwischen C# und .NET ist untrennbar miteinander verbunden, aber nicht dasselbe. C# ist eine Programmiersprache, während .NET eine Entwicklungsplattform ist. C# wird verwendet, um Code zu schreiben, in .NETs Intermediate Language (IL) zu kompilieren und von der .NET -Laufzeit (CLR) ausgeführt zu werden.

Die anhaltende Relevanz von C# .NET: Ein Blick auf die aktuelle VerwendungDie anhaltende Relevanz von C# .NET: Ein Blick auf die aktuelle VerwendungApr 16, 2025 am 12:07 AM

C#.NET ist immer noch wichtig, da es leistungsstarke Tools und Bibliotheken bietet, die mehrere Anwendungsentwicklung unterstützen. 1) C# kombiniert .NET Framework, um die Entwicklung effizient und bequem zu machen. 2) Mechanismus zum Typensicherheit und Müllsammlung von C#erhöht die Vorteile. 3) .NET bietet eine plattformübergreifende laufende Umgebung und eine reichhaltige APIs, wodurch die Flexibilität der Entwicklung verbessert wird.

Vom Web zum Desktop: Die Vielseitigkeit von C# .NETVom Web zum Desktop: Die Vielseitigkeit von C# .NETApr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C# .net und die Zukunft: Anpassung an neue TechnologienC# .net und die Zukunft: Anpassung an neue TechnologienApr 14, 2025 am 12:06 AM

C# und .NET passen sich durch kontinuierliche Aktualisierungen und Optimierungen an die Bedürfnisse neuer Technologien an. 1) C# 9.0 und .NET5 Führen Sie den Datensatztyp und die Leistungsoptimierung ein. 2) .NETCORE verbessert die native und containerische Unterstützung von Cloud. 3) ASP.NetCore integriert sich in moderne Webtechnologien. 4) ML.NET unterstützt maschinelles Lernen und künstliche Intelligenz. 5) Asynchrone Programmierung und Best Practices verbessern die Leistung.

Ist C# .NET das Richtige für Sie? Bewertung seiner AnwendbarkeitIst C# .NET das Richtige für Sie? Bewertung seiner AnwendbarkeitApr 13, 2025 am 12:03 AM

C#.NetissoBableFoREenterPrise-Level Applications-WithemicrosoftCosystemDuetoitsStrongtyPing, Richlibrary, Androbustperformance.

C# Code in .NET: Erforschen des ProgrammiervorgangsC# Code in .NET: Erforschen des ProgrammiervorgangsApr 12, 2025 am 12:02 AM

Der Programmierungsprozess von C# in .NET enthält die folgenden Schritte: 1) Schreiben von C# Code, 2) Kompilieren in eine mittlere Sprache (IL) und 3), die durch die .NET -Laufzeit (CLR) ausführt. Die Vorteile von C# in .NET sind die moderne Syntax, das leistungsstarke Typsystem und die enge Integration in das .NET -Framework, das für verschiedene Entwicklungsszenarien geeignet ist, von Desktop -Anwendungen bis hin zu Webdiensten.

C# .NET: Erforschen von Kernkonzepten und ProgrammierfundamentaldatenC# .NET: Erforschen von Kernkonzepten und ProgrammierfundamentaldatenApr 10, 2025 am 09:32 AM

C# ist eine moderne, objektorientierte Programmiersprache, die von Microsoft und als Teil des .NET-Frameworks entwickelt wurde. 1.C# unterstützt die objektorientierte Programmierung (OOP), einschließlich Einkapselung, Vererbung und Polymorphismus. 2. Asynchrones Programmieren in C# wird über Async implementiert und wartet auf Schlüsselwörter, um die Reaktionsfähigkeit der Anwendungen zu verbessern. 3.. Verwenden Sie LINQ, um Datensammlungen präzise zu verarbeiten. 4. Häufige Fehler umfassen Null-Referenzausnahmen und Indexausnahmen außerhalb des Bereichs. Zu den Debugging -Fähigkeiten gehört die Verwendung eines Debuggers und Ausnahmeberechnung. 5. Leistungsoptimierung umfasst die Verwendung von StringBuilder und das Vermeiden von unnötigem Packung und Unboxing.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

PHPStorm Mac-Version

PHPStorm Mac-Version

Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools