Einen Controller im Browser aufbauen und mit TCP steuern

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Einen Controller im Browser aufbauen und mit TCP steuern

    Schönen guten Abend,

    ich hätte da mal eine Frage und zwar.
    Habe ich mal Programme gesehen, die es ermöglichen, das Programm über ein anderes Gerät mit dem Browser über eine IP Port strecke zu steuern.
    Ich habe es zwar hinbekommen, zwei Formen so zu gestalten, dass sie über einen TCP Nachrichten austauschen, aber wie baue ich im Browser eine Steuerung mit Buttons auf,
    wenn ich im Browser die gleiche IP Port eingebe, wie mein Programm ausgibt?
    Mir fehlt eigentlich das Suchwort, womit ich das realisieren kann.

    Über Hilfe würde ich mich freuen. :)

    Raidon5 schrieb:

    Mir fehlt eigentlich das Suchwort,
    Web-Interface.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Raidon5 Darauf läuft es hinaus.
    Wenn Du das kannst (ich nicht!) kannst Du Dir von einer vergleichbaren Seite den Quelltext anzeigen lassen und Dir ein paar Ideen abgucken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe mal einen Test gemacht, und einen HTML Code in den Browser geschoben, der wird auch angezeigt, wie es sein soll.
    Allerdings funktioniert die Variante

    VB.NET-Quellcode

    1. Dim sendbytes() As Byte = System.Text.Encoding.ASCII.GetBytes("Hier der HTML Code")
    2. TCPServer.Send(sendbytes)


    nicht. Es wird ja nur der Text gesendet, allerdings müsste ich das umwandeln.

    Raidon5 schrieb:

    allerdings müsste ich das umwandeln.
    Wohin umwandeln?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Raidon5 Schreib das ganze doch einfach in eine HTML-Text-Datei und ruf die dann auf mit Process.Start(PFAD_ZUR_HTML).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also schreibe eine HTML-Seite, starte einen TCPListener, wenn eine Anfrage reinkommt, spielst du die Seite aus. Ich hänge Argumente und die Url an (GET request), jenachdem liefer ich dann verschiedene Seiten aus.
    Achte auch auf das Encoding! Ich glaube weniger das du die Seite in Ascii vorliegen hast(was aber sein könnte).

    Ich habe aus Spaß mal ohne Passwortschutz einen MicroController im WLAN gehabt, welcher NeoPixel Stripes ansteuerte, Port weitergeleitet war also öffentlich erreichbar. Nur um zu schauen wie schnell sich jemand einen "Spaß" gönnt und unbefugt via Webseite steuert, also Sicherungsmaßnahmen nicht vergessen, dauerte bei mir keine 2 Wochen bis der Stripe leuchtete.

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

    @RodFromGermany
    Mit Process.Start öffne ich die Datei, aber ich möchte ja eine Verbindung zu dieser Datei behalten.

    @Takafusa
    Ja das mit dem Encoding habe ich auch schon umgestellt.
    Meinst du mit HTML Seite schreiben, eine eigene Website erstellen?
    Wenn ja, das möchte ich nicht. Eigentlich möchte ich das ganze nur lokal steuern können.
    Eine Verbindung habe ich ja, auch kann ich die Sachen auch senden, leider zeigt mit der Browser nur Text an.
    Wenn ich zum Beispiel eine Bilddatei sende, wird auch nur Text angezeigt.
    Mir fehlt, dass der Browser den HTML Code noch umwandelt.
    Ich habe schon ein paar E-Books erstellt, wo ich einen Button mit CSS designed habe und eine Audio abspielen lassen habe.
    Ein wenig Ahnung habe ich davon.
    Aber ne Website möchte ich nicht erstellen.
    Wie gesagt, ich habe schon Programme gesehen, die auf irgendeine Art und Weise einen HTML Code auf einem lokalen Router sendet, sobald man die gleiche IP Port eingibt.
    So schau mal, ich hab mir grad ein paar Minuten Zeit genommen, braucht eine Pause vom daddeln, da kam etwas abwechslung gut. So hast du einen Button im Webbrowser und kannst darauf im Programm reagieren. ( @RodFromGermany ) Jetzt weiss ich auch, was mit umwandeln gemeint war, ohne den entsprende Header auszugegeben, wird das als plaintext gezeigt.(ContentType: text/html; charset=UTF-8) Der Browser muss ja wissen was es ist um damit wie gewollt umzugehen.

    Wenn du das Programm gestartet hast, öffne im Webbrowser die url http://127.0.0.1:8080

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Public Class Form1
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Dim ip As IPAddress = IPAddress.Parse("127.0.0.1")
    6. Dim listener As New TcpListener(ip, 8080)
    7. listener.Start()
    8. Dim bytesA() As Byte = IO.File.ReadAllBytes("a.html")
    9. Dim bytesB() As Byte = IO.File.ReadAllBytes("b.html")
    10. Dim readBuffer(2048) As Byte
    11. While True
    12. Dim client As TcpClient = listener.AcceptTcpClient()
    13. Dim stream As NetworkStream = client.GetStream()
    14. Dim readed As Integer = stream.Read(readBuffer, 0, readBuffer.Length)
    15. Dim text As String = System.Text.Encoding.Default.GetString(readBuffer)
    16. If stream.DataAvailable Then
    17. While readed <> 0
    18. readed = stream.Read(readBuffer, 0, readBuffer.Length)
    19. text &= System.Text.Encoding.Default.GetString(readBuffer)
    20. End While
    21. End If
    22. If text.Contains("buttonclick") Then
    23. Dim header As String = "HTTP/1.1 200 OK" & Environment.NewLine & "Content-Type: text/html; charset=UTF-8" & Environment.NewLine & Environment.NewLine
    24. Dim writeBuffer() As Byte = System.Text.Encoding.UTF8.GetBytes(header)
    25. stream.Write(writeBuffer, 0, writeBuffer.Length)
    26. Try
    27. stream.Write(bytesB, 0, bytesB.Length)
    28. Catch ex As Exception
    29. End Try
    30. Else
    31. Dim header As String = "HTTP/1.1 200 OK" & Environment.NewLine & "Content-Type: text/html; charset=UTF-8" & Environment.NewLine & Environment.NewLine
    32. Dim writeBuffer() As Byte = System.Text.Encoding.UTF8.GetBytes(header)
    33. stream.Write(writeBuffer, 0, writeBuffer.Length)
    34. Try
    35. stream.Write(bytesA, 0, bytesA.Length)
    36. Catch ex As Exception
    37. End Try
    38. End If
    39. client.Close()
    40. End While
    41. End Sub
    42. End Class


    Die beiden HTML Seiten einfach neben die exe legen(a.html und b.html)
    a.html:

    HTML-Quellcode

    1. <!DOCTYPE HTML>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>BrowserButton</title>
    6. </head>
    7. <body>
    8. <h1>Vorm klicken</h1>
    9. <form action="" method="get">
    10. <input type="hidden" name="request" value="buttonclick">
    11. <input type="submit" value="Klicke hier!">
    12. </form>
    13. </body>
    14. </html>

    b.html

    HTML-Quellcode

    1. <!DOCTYPE HTML>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>BrowserButton</title>
    6. </head>
    7. <body>
    8. <h1>Du hast den Button geklickt!</h1>
    9. </body>
    10. </html>


    @Raidon5 Mit einem HttpListener geht das auch, aber da musst du selbst schauen. Hab oben im Code noch 2 Try-Blöcke reingemacht, mit manch einem Browser kommt eine Exception, wegen einer geschlossenen Verbindung.

    Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von „Takafusa“ ()

    @Takafusa vielen Dank, genau danach habe ich gesucht.
    Da sich aber die Form aufhängt, wegen der Schleife, habe ich das ganze in einen Timer gesetzt und die ausgabe von dem Button im Browser auf eine Textbox ausgegeben. Es funktioniert.
    Das ist ein guter Grundriss, wahnsinn.
    @Raidon5
    Mach aber besser mit einem HttpListener, ich seh grad nicht warum bei mir der FireFox die Verbindung kappt.
    Die GUI friert, ja, da musst du dich nun mit Threading anfreunden.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    Hab jetzt noch weiter probiert konnt ja nicht wahr sein, hab das doch mehrfach in C++ gemacht, der FireFox mag es wohl nicht, wenn 2 mal in den Stream geschrieben wird, hin und wieder kam immernoch eine IO-Exception, schreib ich in einem durch, geht es bei mir nun, ohne Exceptions.

    VB.NET-Quellcode

    1. If text.Contains("buttonclick") Then
    2. Dim header As String = "HTTP/1.1 200 OK" & Environment.NewLine & "Content-Type: text/html; charset=UTF-8" & Environment.NewLine & "Content-Length: " & bytesB.Length & Environment.NewLine & Environment.NewLine
    3. Dim writeBuffer As List(Of Byte) = System.Text.Encoding.UTF8.GetBytes(header).ToList()
    4. writeBuffer.AddRange(bytesB)
    5. stream.Write(writeBuffer.ToArray(), 0, writeBuffer.Count)
    6. Else
    7. Dim header As String = "HTTP/1.1 200 OK" & Environment.NewLine & "Content-Type: text/html; charset=UTF-8" & Environment.NewLine & "Content-Length: " & bytesA.Length & Environment.NewLine & Environment.NewLine
    8. Dim writeBuffer As List(Of Byte) = System.Text.Encoding.UTF8.GetBytes(header).ToList()
    9. writeBuffer.AddRange(bytesA)
    10. stream.Write(writeBuffer.ToArray(), 0, writeBuffer.Count)
    11. End If
    12. client.Close()

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

    Dann wäre es eine gute Idee mal deinen Versuch mit Threading hier zu posten. Eine wirklich dauerhafte Verbindung hat man so oder so nicht, wird immer aufgebaut und geschlossen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()