| |
VB.NET - FortgeschrittenetcpClient - Header-Daten korrekt zurücksenden | | | Autor: NeoGriever | Datum: 11.06.19 14:24 |
| Ich verzweifle grad an einem eigentlich einfachen System ... Im Netz kann ich partou keine Lösung für genau das finden, was ich lösen will.
Imports System.Net
Imports System.Net.Sockets
Imports System.Collections.Specialized
Imports System.IO
Imports System.Threading
Imports System.Windows.Forms
Module Program
Public tcpClient As New System.Net.Sockets.TcpClient()
Sub Main()
Dim rThread As New Thread(AddressOf StartListening)
rThread.IsBackground = True
rThread.Start()
Console.ReadLine()
End Sub
Sub StartListening()
Dim myTcpListener As TcpListener
Try
myTcpListener = New TcpListener(5155)
Catch exp As Exception
Console.WriteLine("Error:")
Console.WriteLine(exp.Message & ":" & exp.StackTrace)
Exit Sub
End Try
myTcpListener.Start()
While (True)
Try
Dim networkStream As NetworkStream
Dim tcpClient As TcpClient
If myTcpListener.Pending Then
tcpClient = myTcpListener.AcceptTcpClient()
networkStream = tcpClient.GetStream()
If networkStream.CanRead Then
Dim buffer(tcpClient.ReceiveBufferSize) As Byte
networkStream.Read(buffer, 0, CInt(tcpClient.ReceiveBufferSize))
Dim result As String = System.Text.Encoding.UTF8.GetString(buffer).Trim()
Console.WriteLine(DateTime.Now.ToLongTimeString())
Console.WriteLine(result)
End If
If networkStream.CanWrite Then
Answer(networkStream, String.Format("HTTP/1.0 {0} {1}\r\n", "200", _
"Ready"))
Answer(networkStream, String.Format("Content-Type: {0}\r\n", _
"image/jpeg"))
Answer(networkStream, "\r\n\r\n")
networkStream.Flush()
Dim picBuffer() As Byte = System.IO.File.ReadAllBytes( _
"C:\Wallpaper\wald.jpg")
networkStream.Write(picBuffer, 0, picBuffer.Length)
End If
networkStream.Close()
tcpClient.Close()
End If
Catch exp As Exception
Console.WriteLine("Error:")
Console.WriteLine(exp.ToString())
End Try
End While
myTcpListener.Stop()
End Sub
Sub Answer (ByRef strm As NetworkStream, ByVal strng As String)
Console.WriteLine("Gesendet:")
Console.WriteLine(" --- ")
Console.WriteLine(strng)
Console.WriteLine(" --- ")
Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(strng)
strm.Write(data, 0, data.Length)
End Sub
End Module Es ist ein #Dev4.4-Konsolenanwendungs-Projekt auf vb.net-basis.
Es dürfte aber klar sein, was ich versuche. Dennoch krieg ich ständig beim Aufruf von localhost:5155 application/octet-stream als datentyp ... -.- ich will nur, dass das bild angezeigt wird ... (oder entsprechend halt die daten, die ich anzeigen will)
Kann mir da wer nen Tipp geben, wie ich das mit den Header-Daten korrekt umgesetzt krieg? | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: sv00010 | Datum: 12.06.19 20:45 |
| NeoGriever schrieb:
Zitat: | |
Kann mir da wer nen Tipp geben, wie ich das mit den
Header-Daten korrekt umgesetzt krieg? | |
Kann es daran liegen, dass du auf localhost deinen Daten holst?
Ich glaube, dass wenn man auf localhost im Netzwerk lesen und schreiben will, man zwei unterschiedliche Ports verwenden muss, damit man nicht seine eigenen gerade gesendeten Daten, selber wieder als zu lesende Antwort zugeschickt bekommt (man führt sozusagen ein Gespräch und merkt nicht, dass man sich selber antwortet). | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: NeoGriever | Datum: 12.06.19 21:33 |
| ich will ja keinen chat umsetzen, sondern nur einen datesende-system auf http-basis.
Rufe ich im Browser http://localhost:5155/ auf, soll mein Programm (siehe code) ein Bild zurückgeben. Aktuell teste ich es noch mit einer lokalen datei, aber später soll ein dynamisch generiertes Bild zurückgesendet werden. DAFÜR möchte ich aber wissen, wie ich es hinkriege, dass der Browser die Daten nicht als klartext, sondern als BILD erkennt. Dafür brauche ich das Wissen, um eben explizit zwischen Header-Daten und Content-Daten zu wechseln.
Aktuell ist mein Problem: Egal, was ich als Header-Daten übertrage. Sowie ich auch nur ein Byte an Content-Daten senden will, passiert in 90% der Fälle nix. Beim Senden des Bildes bekomme ich einen unvollständigen Binär-Octet-Stream zurück ...
Ich hoffe, mein Problem ist nun verständlicher ausgedrückt.
Und: ich habe es ja schon korrekt hinbekommen, daten hin- und her zu schicken. leider habe ich es eben NICHT hinbekommen, den Content-Type an den Browser zu vermitteln und dann korrekt daten hinterher zu schicken. | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: sv00010 | Datum: 13.06.19 16:02 |
| In solch einem Fall würde ich vermutlich einfach mogeln, z.B. eine temporäre Datei erstellen und dann einfach nur den Downloadpfad zurückgeben und danach dann einfach ganz normal mit WebClient.DownloadFile die Datei runterladen. | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: NeoGriever | Datum: 13.06.19 18:19 |
| falsche richtung ... Es soll keine Datei vom Server an mein Programm, sondern genau umgedreht, von meinem Programm an den Browser weitergereicht werden.
Kurz:
1. http://localhost:5155 wird aufgerufen
2. Programm bekommt TCP-Anfrage
3. Programm liefert Header-Daten zurück
4. Programm liefert Binär-Daten des Bildes zurück
5. Browser, worüber http://localhost:5155 aufgerufen wurde, zeigt Bild an
DAS ist der Plan.
Aber bei Schritt 3 hapert es. Ich kriege es partou nicht hin, dem Browser die Header-Daten korrekt zuzusenden. Egal, was ich an Header-Daten angebe (Sogar wirklich umfangreiche und vollständige Daten), ich erhalte immer einen application/octet-stream zurück mit unvollständigen Binärdaten des Bildes.
Jetzt verstanden? | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: sv00010 | Datum: 13.06.19 22:09 |
| NeoGriever schrieb:
Zitat: | |
Jetzt verstanden? | |
Ich weiß nicht ob das richtig und hilfreich ist, aber ich würde es zuerst mal mit HttpWebRequest und HttpWebResponse versuchen.
Der Vorteil ist, da gibt es Proprties und man muss das Zeug nicht selber zusammenbasteln und hoffen dass man alles richtig gemacht hat.
https://stackoverflow.com/questions/2896729/how-to-customize-tcp-port-number-other-than-default-80
Beitrag wurde zuletzt am 13.06.19 um 22:11:25 editiert. | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: NeoGriever | Datum: 14.06.19 02:51 |
| Es ist WIEDER die Falsche richtung. Ich will keine Datei INS PROGRAMM Laden ... sondern das programm soll eine datei browser-spezifisch an den browser zurücksenden, wenn http://localhost:5155/ aufgerufen wird <_< | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: sv00010 | Datum: 14.06.19 07:43 |
| NeoGriever schrieb:
Zitat: | | Es ist WIEDER die Falsche richtung. Ich will keine Datei INS
PROGRAMM Laden ... sondern das programm soll eine datei
browser-spezifisch an den browser zurücksenden, wenn
http://localhost:5155/ aufgerufen wird <_< | |
Vermutlich wirst du mit einem Programm wie Fiddler den Netzwerkverkehr debuggen müssen.
https://en.wikipedia.org/wiki/Fiddler_(software)
Ich habe das jetzt so verstanden, als wolltest du einen Webserver programmieren.
Vermutlich bin ich nicht darauf gekommen, weil ich selbstverständlich davon ausgegangen bin,
dass man einfach einen bereits fertigen Webserver wie z.B. Apache installiert.
https://www.graccem.com/php/datei-an-browser-schicken | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: NeoGriever | Datum: 14.06.19 12:42 |
| Apache ist für die Zwecke, die ich haben will, zu umfangreich und zu groß und sowieso nicht die richtige programmiersprache.
Ich weiß schon, warum ich mit VB.NET eine grafik zurückgeben will.
Wenn ich aus dem Programm schlau werden würde, würd ich ja gerne dann mal verstehen wollen, wo die header-daten aufhören und die content-daten anfangen <_<
DAS ist der Punkt, de ich nach wie vor nicht hinkriege. | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: NeoGriever | Datum: 14.06.19 15:57 |
| Dieses Projekt habe ich auch schon durchforstet. Aber ich verstehe partou nicht, wie zum teufel das c#-script (obwohl ich es halt komplett lesen kann) zwischen header-daten und content-daten abtrennt ...
Content-Length bringt keine Lösung ... | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: sv00010 | Datum: 14.06.19 16:43 |
| NeoGriever schrieb:
Zitat: | |
Content-Length bringt keine Lösung ... | |
Es könnte eventuell Probleme geben mit UTF8, weil die Answer-Routine selbstständig aus dem String ein Bytearray erstellt.
UTF8 verwendet mehr als 1 Byte pro Zeichen, so wie es vom eingelesenen Zeichen gerade gebraucht wird. | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: sv00010 | Datum: 14.06.19 16:59 |
| Zitat: | |
Sobald der Header mit einer Leerzeile (beziehungsweise zwei aufeinanderfolgenden Zeilenenden) abgeschlossen wird, sendet der Rechner, der einen Web-Server (an Port 80) betreibt, seinerseits eine HTTP-Antwort zurück. Diese besteht aus den Header-Informationen des Servers, einer Leerzeile und dem tatsächlichen Inhalt der Nachricht, also dem Dateiinhalt der infotext.html-Datei.
| |
https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: sv00010 | Datum: 14.06.19 18:32 |
| Eventuell liegt es auch an "200 Ready".
Überall wo ich nachgelesen habe steht "200 OK". | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: Kuno60 | Datum: 15.06.19 22:45 |
| Hallo,
Dein Code funktioniert, wenn Du einen kleinen Fehler beseitigst
VB unterstützt, im Gegensatz zu C#, keine Escape-Zeichen in Strings.
Ändere diese 3 Zeilen:
Answer(networkStream, String.Format("HTTP/1.0 {0} {1}\r\n", "200", "Ready"))
Answer(networkStream, String.Format("Content-Type: {0}\r\n", "image/jpeg"))
Answer(networkStream, "\r\n\r\n") in:
Answer(networkStream, String.Format("HTTP/1.0 {0} {1}", "200", "OK"))
Answer(networkStream, String.Format("Content-Type: {0}", "image/jpeg"))
Answer(networkStream, vbCrLf & vbCrLf) | |
Re: tcpClient - Header-Daten korrekt zurücksenden | | | Autor: NeoGriever | Datum: 16.06.19 01:50 |
| Kuno60. Vor dir verneige ich mich! Du hast mein Problem verstanden und es sofort gelöst. *verneig*
Nun kann ich endlich das machen, was ich vorhatte Super!
(ich kann mit vb.net viel besser live zeichnen, als mit canvas. außerdem hab ich bei canvas/javascript das problem, dass ich z. b. api's über crosssite-protokolle hinweg nicht ansteuern kann, was ich aber mit vb.net kann - Endlich komm ich weiter. *verneig*)
Vielen Vielen Vielen Dank! | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|