TCPClient: Wie Verbindung nach Verbind.abbau wieder aufbauen Verfasst am: 16.03.2009, 07:09
Hallo,
Ich schreibe eine TcpClient-Anwendung, die sich mit eine Server verbindet und die vom Server gesendeten Daten verarbeitet.
Das klappt auch sehr gut.
Nun ist es so, das der Server jeden Tag zu einer festgelegten Zeit die Verbindung abbaut - ca. 30 Sekunden lang für interne Sicherungszwecke).
Nun bekomme ich es nicht hin, die Verbindung wieder aufzubauen. Ich bekomme folgende Fehlermeldung von VB 2008:
Code:
Unbehandelte Ausnahme: System.Net.Sockets.SocketException:
Eine Verbindungsanforderung bezog sich auf einen bereits verbundenen Socket
Ich öffne die Verbindung wie folgt:
Code:
Dim tcpClient As New System.Net.Sockets.TcpClient()
tcpClient.Connect(IP, Port)
Wenn ich nun tcpClient.Connect wieder aufrufe bekomme ich obrige Fehlermeldung
Wenn ich die Verbindung vorher mit tcpClient.Close() schliesse (was ja logisch wäre)
bekomme ich folgende Fehlermeldung:
Code:
Unbehandelte Ausnahme: System.ObjectDisposedException:
Auf das verworfene Objekt kann nicht zugegriffen werden.
Objektname: "System.Net.Sockets.TcpClient"
Ist eigentlich auch ganz logisch, weil ich der Beschreibunf zu tcpClient-Close() steht, das das Object(tcpClient) komplett verworfen wird.
Mit Dim tcpClient .... kann ich aber im Programmfluss das Object nicht wieder neu erstellen (siehe oben), wenn ich das versuche bekomme ich folgende Fehlermeldung:
Code:
Unbehandelte Ausnahme: System.Net.Sockets.SocketException:
Eine Verbindungsanforderung bezog sich auf einen bereits verbundenen Socket
bei System.Net.Sockets.TcpClient.Connect(String hostname, Int32 port)
Und ich finde keine Möglichkeit die Verbindung und nur die Verbindung zum Server zu trenne um sie dann später neu aufzubauen.
Wahrscheinlich bin ich mal wieder blind oder die VB2008/Net-Entwickler habe das sehr gut versteckt. _________________ 8-Bit sind genug ....
EightBitWitch Newbie
Anmeldedatum: 16.03.2009 Beiträge: 4
Verfasst am: 16.03.2009, 09:36
Ich habe über eine Umweg (Beschreibung un Beispiel zu der Socket-Klasse) eine Lösung gefunden.
Die Lösung sieht wie folgt aus:
Im Deklarationsteil baue ich eine leere Hülle für tcpClient auf
Code:
Dim tcpClient As System.Net.Sockets.TcpClient = Nothing
Dim ClientSollLaufen as boolean = true
Dim ServerNotDown as boolean =true
Und in der Programmschleife, wo das eigentliche Client-Programm drin läuft fülle ich die Hülle mit leben und hauche dieser am Ende das Leben wieder aus, um es im nächsten Durchgang neu erstehen zu lassen:
Code:
while ClientSollLaufen
tcpClient = New System.Net.Sockets.TcpClient()
tcpClient.Connect(IP, PORT)
networkStream = tcpClient.GetStream()
if DownTime then
ServerNotDown = false
end if
end while
tcpClient.Close()
if ReadKey()="0" then
'Client beenden
ClientSollLaufen = False
else
'Zwei Minuten warten
end if
end while
Es klappt und ist, wenn man objektorientiert denkt auch in sich logisch, aber nicht effizient (wie vieles an der OOP).
Ja, diese verflixte objektorientierte Programmierung ... das gab es zur Zeiten des Commodore 64 nicht und ab Turbo Pascal 5.5 habe ich mich auch immer drum rum gedrückt. _________________ 8-Bit sind genug ....