vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
tcpClient - 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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 <_<
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 &lt;_&lt;


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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: tcpClient - Header-Daten korrekt zurücksenden 
Autor: sv00010
Datum: 14.06.19 15:07

Die Header-Eigenschaft "Content-Length: " gibt an wie groß der nachfolgende Content ist.

https://www.vb-paradise.de/index.php/Thread/55063-Webserver-erstellen/

https://www.codeproject.com/Articles/137979/Simple-HTTP-Server-in-C
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 ...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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".
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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)

Grüße, Kuno
---------------
Hobbyprogrammierer
VB6 bis VB16

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2019 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel