Hallo an euch alle
Bin schon seit 2009 hier im Forum regelmäßig am schauen und hatte auch einen Account, allerdings keine Daten mehr dafür Also ein neuer Account. Ich habe vor 15 Jahren Anwendungsentwicklung gelernt aber leider nach der Ausbildung bis heute nie wirklich am programmieren gewesen trotz Arbeit in der IT-Branche. Deswegen immer mal zuhause um nicht alles zu verlernen
Nachdem ich ein wenig mit Datenbanken rumprobiert habe bin ich nun beim thema Networking angekommen. Einfache Client/Server anwendung und Daten hin und her schicken. Klappt auch alles soweit ganz gut. Allerdings wirft sich für mich immer wieder die Frage auf; Wie beendet man am saubersten eine Verbindung (Wer sollte diese am besten schließen) um danach eine neue Verbindung aufzubauen?
Zum Test habe ich eine kleine Client/Server Anwendung die Dauerhaft das Desktopbild zum Server senden und dieser es gleich in eine einfache pictureBox anzeigt. Funktioniert auch alles super.
Clientseite:
Hier läuft er in der While Schleife solange durch bis ich manuell den "Verbunden" Boolean auf False setze. Dann soll er stream und client schließen. Funktioniert auch soweit super.
Serverseite:
Auch auf Serverseite arbeite ich mit einem Bool um die Sub zu verlassen und somit auch (das hoffe ich) des Thread beende. Die Listen-Sub starte ich in einem Thread und das ".Abort" beendet ja nicht wirklich den thread. Beende ich jetzt den Client, bekomme ich bei der picturebox den Fehler wie unten im Kommentar. Ich hatte zwar mal ein wenig mit invoke probiert, aber das funktionierte auch nicht. Ganz unabhängig von dem Fehler. Was wäre die Beste Lösung um die Verbindung zu schließen um danach wieder sauber aufzubauen?
Wenn das "ein wenig" dreckig programmiert aussieht, seht es mir nach. Ich muss langsam erstmal wieder rein kommen
edit: ich habe bewusst try catch weggelassen um die Fehler zu sehen und das ganze ein wenig besser zu verstehen
edit edit: Euch allen einen schönen 4. Advent
Beste Grüße
Bin schon seit 2009 hier im Forum regelmäßig am schauen und hatte auch einen Account, allerdings keine Daten mehr dafür Also ein neuer Account. Ich habe vor 15 Jahren Anwendungsentwicklung gelernt aber leider nach der Ausbildung bis heute nie wirklich am programmieren gewesen trotz Arbeit in der IT-Branche. Deswegen immer mal zuhause um nicht alles zu verlernen
Nachdem ich ein wenig mit Datenbanken rumprobiert habe bin ich nun beim thema Networking angekommen. Einfache Client/Server anwendung und Daten hin und her schicken. Klappt auch alles soweit ganz gut. Allerdings wirft sich für mich immer wieder die Frage auf; Wie beendet man am saubersten eine Verbindung (Wer sollte diese am besten schließen) um danach eine neue Verbindung aufzubauen?
Zum Test habe ich eine kleine Client/Server Anwendung die Dauerhaft das Desktopbild zum Server senden und dieser es gleich in eine einfache pictureBox anzeigt. Funktioniert auch alles super.
Clientseite:
Hier läuft er in der While Schleife solange durch bis ich manuell den "Verbunden" Boolean auf False setze. Dann soll er stream und client schließen. Funktioniert auch soweit super.
VB.NET-Quellcode
- Public Sub Beginn()
- Try
- Dim client As New TcpClient
- Dim stream As NetworkStream
- client.Connect("127.0.0.1", 1909)
- While Verbunden = True
- Dim bf As New BinaryFormatter
- stream = client.GetStream
- bf.Serialize(stream, Desktop())
- End While
- client.GetStream.Close()
- client.Close()
- stream.Close()
- Catch ex As Exception
- MsgBox(ex.Message)
- End Try
- End Sub
- Public Function Desktop() As Image
- Dim bounds As Rectangle = Nothing
- Dim screenshot As System.Drawing.Bitmap = Nothing
- Dim graph As Graphics = Nothing
- bounds = Screen.PrimaryScreen.Bounds
- screenshot = New Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
- graph = Graphics.FromImage(screenshot)
- graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
- Return screenshot
- End Function
Serverseite:
Auch auf Serverseite arbeite ich mit einem Bool um die Sub zu verlassen und somit auch (das hoffe ich) des Thread beende. Die Listen-Sub starte ich in einem Thread und das ".Abort" beendet ja nicht wirklich den thread. Beende ich jetzt den Client, bekomme ich bei der picturebox den Fehler wie unten im Kommentar. Ich hatte zwar mal ein wenig mit invoke probiert, aber das funktionierte auch nicht. Ganz unabhängig von dem Fehler. Was wäre die Beste Lösung um die Verbindung zu schließen um danach wieder sauber aufzubauen?
VB.NET-Quellcode
- Private Sub Listen()
- If Verbunden = False Then
- Exit Sub
- End If
- Dim client As New TcpClient
- Dim Server As New TcpListener(IPAddress.Any, 1909)
- Dim stream As NetworkStream
- While client.Connected = False
- server.Start()
- client = server.AcceptTcpClient
- End While
- Dim bf As New BinaryFormatter
- While client.Connected = True
- stream = client.GetStream
- pbDesktop.Image = bf.Deserialize(stream) 'Hier entsteht der Fehler: System.Runtime.Serialization.SerializationException: "Das Datenstromende wurde erreicht, bevor die Verarbeitung abgeschlossen wurde."
- End While
- client.Close()
- stream.Close()
- Server.Stop()
- End Sub
- Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
- Verbunden = True
- Listenthread.Start() 'Die Listen-Sub wird als Thread gestartet
- btnStart.Enabled = False
- End Sub
Wenn das "ein wenig" dreckig programmiert aussieht, seht es mir nach. Ich muss langsam erstmal wieder rein kommen
edit: ich habe bewusst try catch weggelassen um die Fehler zu sehen und das ganze ein wenig besser zu verstehen
edit edit: Euch allen einen schönen 4. Advent
Beste Grüße
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Litmann“ ()