Webserver erstellen?

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Thunderbolt.

    HTML Dateien anzeigen?
    Ich würde sagen, du musst zuerst mal verstehen, was überhaupt ein Webserver ist.
    Der besteht nämlich nicht nur aus dem "HTML Dateien anzeigen".
    Du musst bspw. auch mittels einem PHP-Parser den PHP-Code in HTML umwandeln.

    Dann musst du den HTML-Code parsen, d.h. alle Elemente der Datei in eine sichtbare Website umwandeln.
    MrLee hat mal einen kleinen Parser gepostet, auch ich habe schon mal versucht einen HTML Parser zu schreiben.
    Lief anfangs sehr gut, doch spätestens beim Javascript und/oder beim anzeigen von Flash-Dateien wird es scheitern.
    Hab ich gesagt das ein Webserver nur aus html dateien anzeigen besteht? Mit ist schon klar was ein webserver ist und für den server kann ich auch den multiserver von kevin nehmen. aber wie kann ich html dateien anzeigen? danke für jede hilfe.
    Dann musst du den HTML-Code parsen, d.h. alle Elemente der Datei in eine sichtbare Website umwandeln.

    Parsen und Interpretieren tut der Browser. Der Server stellt die reinen Daten bereit, d.h. du überträgst die HTML wie alle anderen Dateien auch.
    Ablauf in etwa so: Der Request beim Aufruf geht ein, als Antwort sendest du den Header, damit der Browser weiß, was mit dem folgenden zu tun ist, dann sendest du die HTML. Der Browser wird diese interpretieren und Bilder und andere externe Inhalte jedes mal als neuen Request an den Server stellen. Auch diese muss der Server mit dem richtigen Header in einem unabhängigen Vorgang beantworten. Irgendwann ist dann alles geladen, die Website ist vollständig.
    Nur Serverseitiges wie PHP wirst du wie bereits erwähnt selbst implementieren müssen, wenn du es überhaupt brauchst.
    Danke. @SystemUnknown hier mal der Code:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Imports System.Threading
    4. Imports System.Text
    5. Imports System.IO
    6. Public Class Module1
    7. Public Shared Sub Main()
    8. Try
    9. Dim hostName As String = Dns.GetHostName()
    10. Dim serverIP As IPAddress = Dns.Resolve(hostName).AddressList(0)
    11. ' Web Server Port = 80
    12. Dim Port As String = "80"
    13. Dim tcpListener As New TcpListener(serverIP, Int32.Parse(Port))
    14. tcpListener.Start()
    15. Console.WriteLine("Web server started at: " & serverIP.ToString() & ":" & Port)
    16. Dim httpSession As New HTTPSession(tcpListener)
    17. Dim serverThread As New Thread(New ThreadStart(AddressOf httpSession.ProcessThread))
    18. serverThread.Start()
    19. Catch ex As Exception
    20. Console.WriteLine(ex.StackTrace.ToString())
    21. End Try
    22. End Sub
    23. End Class
    24. Public Class HTTPSession
    25. Private tcpListener As System.Net.Sockets.TcpListener
    26. Private clientSocket As System.Net.Sockets.Socket
    27. Public Sub New(ByVal tcpListener As System.Net.Sockets.TcpListener)
    28. Me.tcpListener = tcpListener
    29. End Sub
    30. Public Sub ProcessThread()
    31. While (True)
    32. Try
    33. clientSocket = tcpListener.AcceptSocket()
    34. ' Socket Information
    35. Dim clientInfo As IPEndPoint = CType(clientSocket.RemoteEndPoint, IPEndPoint)
    36. Console.WriteLine("Client: " + clientInfo.Address.ToString() + ":" + clientInfo.Port.ToString())
    37. ' Set Thread for each Web Browser Connection
    38. Dim clientThread As New Thread(New ThreadStart(AddressOf ProcessRequest))
    39. clientThread.Start()
    40. Catch ex As Exception
    41. Console.WriteLine(ex.StackTrace.ToString())
    42. If clientSocket.Connected Then
    43. clientSocket.Close()
    44. End If
    45. End Try
    46. End While
    47. End Sub
    48. Protected Sub ProcessRequest()
    49. Dim recvBytes(1024) As Byte
    50. Dim htmlReq As String = Nothing
    51. Dim bytes As Int32
    52. Try
    53. ' Receive HTTP Request from Web Browser
    54. bytes = clientSocket.Receive(recvBytes, 0, clientSocket.Available, SocketFlags.None)
    55. htmlReq = Encoding.ASCII.GetString(recvBytes, 0, bytes)
    56. Console.WriteLine("HTTP Request: ")
    57. Console.WriteLine(htmlReq)
    58. ' Set WWW Root Path
    59. Dim rootPath As String = Directory.GetCurrentDirectory() & "\WWWRoot\"
    60. ' Set default page
    61. Dim defaultPage As String = "index.html"
    62. Dim strArray() As String
    63. Dim strRequest As String
    64. strArray = htmlReq.Trim.Split(" ")
    65. ' Determine the HTTP method (GET only)
    66. If strArray(0).Trim().ToUpper.Equals("GET") Then
    67. strRequest = strArray(1).Trim
    68. If (strRequest.StartsWith("/")) Then
    69. strRequest = strRequest.Substring(1)
    70. End If
    71. If (strRequest.EndsWith("/") Or strRequest.Equals("")) Then
    72. strRequest = strRequest & defaultPage
    73. End If
    74. strRequest = rootPath & strRequest
    75. sendHTMLResponse(strRequest)
    76. Else ' Not HTTP GET method
    77. strRequest = rootPath & "Error\" & "400.html"
    78. sendHTMLResponse(strRequest)
    79. End If
    80. Catch ex As Exception
    81. Console.WriteLine(ex.StackTrace.ToString())
    82. If clientSocket.Connected Then
    83. clientSocket.Close()
    84. End If
    85. End Try
    86. End Sub
    87. ' Send HTTP Response
    88. Private Sub sendHTMLResponse(ByVal httpRequest As String)
    89. Try
    90. ' Get the file content of HTTP Request
    91. Dim streamReader As StreamReader = New StreamReader(httpRequest)
    92. Dim strBuff As String = streamReader.ReadToEnd()
    93. streamReader.Close()
    94. streamReader = Nothing
    95. ' The content Length of HTTP Request
    96. Dim respByte() As Byte = Encoding.ASCII.GetBytes(strBuff)
    97. ' Set HTML Header
    98. Dim htmlHeader As String = _
    99. "HTTP/1.0 200 OK" & ControlChars.CrLf & _
    100. "Server: WebServer 1.0" & ControlChars.CrLf & _
    101. "Content-Length: " & respByte.Length & ControlChars.CrLf & _
    102. "Content-Type: " & getContentType(httpRequest) & _
    103. ControlChars.CrLf & ControlChars.CrLf
    104. ' The content Length of HTML Header
    105. Dim headerByte() As Byte = Encoding.ASCII.GetBytes(htmlHeader)
    106. Console.WriteLine("HTML Header: " & ControlChars.CrLf & htmlHeader)
    107. ' Send HTML Header back to Web Browser
    108. clientSocket.Send(headerByte, 0, headerByte.Length, SocketFlags.None)
    109. ' Send HTML Content back to Web Browser
    110. clientSocket.Send(respByte, 0, respByte.Length, SocketFlags.None)
    111. ' Close HTTP Socket connection
    112. clientSocket.Shutdown(SocketShutdown.Both)
    113. clientSocket.Close()
    114. Catch ex As Exception
    115. Console.WriteLine(ex.StackTrace.ToString())
    116. If clientSocket.Connected Then
    117. clientSocket.Close()
    118. End If
    119. End Try
    120. End Sub
    121. ' Get Content Type
    122. Private Function getContentType(ByVal httpRequest As String) As String
    123. If (httpRequest.EndsWith("html")) Then
    124. Return "text/html"
    125. ElseIf (httpRequest.EndsWith("htm")) Then
    126. Return "text/html"
    127. ElseIf (httpRequest.EndsWith("txt")) Then
    128. Return "text/plain"
    129. ElseIf (httpRequest.EndsWith("gif")) Then
    130. Return "image/gif"
    131. ElseIf (httpRequest.EndsWith("jpg")) Then
    132. Return "image/jpeg"
    133. ElseIf (httpRequest.EndsWith("jpeg")) Then
    134. Return "image/jpeg"
    135. ElseIf (httpRequest.EndsWith("pdf")) Then
    136. Return "application/pdf"
    137. ElseIf (httpRequest.EndsWith("pdf")) Then
    138. Return "application/pdf"
    139. ElseIf (httpRequest.EndsWith("doc")) Then
    140. Return "application/msword"
    141. ElseIf (httpRequest.EndsWith("xls")) Then
    142. Return "application/vnd.ms-excel"
    143. ElseIf (httpRequest.EndsWith("ppt")) Then
    144. Return "application/vnd.ms-powerpoint"
    145. Else
    146. Return "text/plain"
    147. End If
    148. End Function
    149. End Class
    Ich habe jetzt zwar den Code verstehe ihn aber nicht richtig wo soll ich jetzt meine Daten hin packen und wie funktioniert das mit dem HTML??

    Vielen Dank
    Du hast da jetzt doch einen code um die anfragen des browsers zu handeln
    Mehr brauchst du fur einen apache server eigentlich nicht(ausser php villeicht)

    Mit dem anzeigen hat der server nichts zu tun

    Ps: kleine sicherheitslucke
    Wenn jm das request auf irgendeine datei schickt dann bekommt er auch diese das heist dizr system dateien sind nicht sicher

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Warfley“ ()

    Na wundervoll, ein super Zeitvertreib :D. Naja mal was anderes geht auch ein Verzeichnisbrowsing so wie bei Apache wenns keine index.html gibt? Ich habe versucht mehrere Standart Dateien zu erlauben das geht aber nicht also ich meine das statt index.html auch index.htm geht.

    Danke
    du kannst einfach mit

    VB.NET-Quellcode

    1. If IO.File.Exsits(rootPath+"Index.html") Then
    2. defaultPage = "index.html"
    3. End IF

    überprüfen

    und für das browser system musst du eben die html files mit einer for each schleife durchgehen und dann eine html datei schreiben und senden
    Danke. Jetzt hab ich alles was ich will ich habe ein Usersystem hinbekommen jedoch läuft das sehr sehr unsicher. Da im prinzip alles per Datei übergeben wird also alles in der Browser url steht. Wie kann man sowas wie bei https machen das der Browser so ein Formular anzeigt?

    Vielen Dank
    Okey.. Wie implentier ich Https ich schau mal ich meld mich dann wieder.


    edit: Bei vielen anderen Websites ists doch auch so das dies ohne https geht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FinnSoft“ ()