Hallo zusammen 🙂
Ich habe mich nun bei euch registriert, da ich mit meinem Problem einfach nicht voran komme 🙁
Ich habe einen Objekterkennungssensor, der mir, nachdem ich es per Befehl angefordert habe, ein Bitmap sendet.
Da ich leider mit der Datenübertragung in C# sehr wenig Erfahrung habe, scheitere ich daran, das Bitmap einzulesen...
Das Protokoll des Sensors sieht folgendermaßen aus:
<Ticket><Inhalt>CR LF
_______________________________
<Inhalt> ist das Kommando an das Gerät oder die Antwort vom Gerät (z B Auswerteergebnis)
<Ticket> ist eine Zeichenkette mit 4 Ziffern 0-9, die als Dezimalzahl zu interpretieren sind. Eine Nachricht an das Gerät mit einem bestimmten
Ticket wird mit einer Nachricht vom Gerät mit dem gleichen Ticket
beantwortet Ticket 0000 ist reserviert für Nachrichten, die selbstständig vom Gerät gesendet werden
Alle Antworten vom Gerät werden mit einem CR- und einem LF-Zeichen
abgeschlossen
Der Befehl zum Übertragen des Bildes ist so aufgebaut:
Ich sende zum Gerät : 1234I? <- "1234" ist das Ticket und "I?" der Befehl zum Bild abfragen.
Als Antwort laut Beschreibung sollte kommen:
<ticket><länge><bilddaten>
______________________________
<länge>: Zeichenkette mit genau 9 Ziffern, die als Dezimalzahl interpretiert die
Länge der folgenden Bilddaten in Byte angibt.
Bilddatenformat gemäß Einstellung im Bedienprogramm.
Das Empfangen anderer Antworten vom Sensor habe ich schon hinbekommen, allerdings waren das nur kleine Textantworten mit sehr kurzer Länge.
Ich denke für euch Experten wird das sicher ein kleines Problem sein, aber ich verzweifle schon länger daran. Zudem bin ich bei der Thematik Datenübertragung sehr weit am Anfang.
Ich wäre über jeden Tipp oder Codeausschnitt dankbar, der mir bei diesem Problem helfen könnte.
Vielen Dank schonmal vorab
M@tz3
Hallo M@tz3,
wegen "Das Empfangen anderer Antworten vom Sensor habe ich schon hinbekommen" nehme ich an, dass du mit der Kommunikation grundsätzlich kein Problem hast, sondern nur beim Bild hängst.
Hier schreibst du nur von Bilddaten, somit kann nicht gezielt geholfen werden da wir nicht wissen in welchem Format die Bilddaten ankommen.
Werden die Bilddaten als byte-Stream gesendet od. als base64-kodierter String?
Kannst du eine Beispielantwort anhängen, damit wir genau wissen wie das aufgebaut ist?
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Je nach länge der Daten wirst du mehrere Events bekommen.
Mit dem 1. Event enthältst du die Ticketnummer und die Bilddatenlänge, damit kennst du die Gesamtlänge der Daten.
Du must dann die Daten anhängen, bis du alle Daten empfangen hast.
Danach kannst du aus den Bilddaten das Bitmap erstellen.
Hallo ihr zwei,
danke schonmal für eure Hilfe.
Also mein Anfänglicher, sicherlich abenteuerlicher code zum Empfangen der Antworten sah bis jetzt so aus:
string _Text = "";
TcpClient tcpc = new TcpClient();
tcpc.Connect("192.168.0.49", 50010);
stream = tcpc.GetStream();
stream.Write(StringToByteArray("0815" + sendbox.Text + "\r\n"), 0, StringToByteArray("0815" + sendbox.Text + "\r\n").Length);
while ((_Text += (char)stream.ReadByte()).Last() != 10)
{
}
receivebox.Text = _Text;
tcpc.Close();
Das funktioniert soweit für die normalen Textantworten auch gut, nur eben beim Bild nicht. Zum Format selber kann ich leider auch nicht viel sagen, da ich da absoluter Anfänger bin.
Aber ich habe hier mal ein paar mitgeschnittene Infos.
Hier mal ein Paket einer Textantwort, die auch korrekt ankommt:
0000 30 85 a9 15 9e b9 00 02 01 21 41 61 08 00 45 00 0........!Aa..E.
0010 00 a0 44 c7 40 00 40 06 73 fa c0 a8 00 31 c0 a8 ..D.@.@.s....1..
0020 00 15 c3 5a 06 96 1c 04 eb fc fb 2d 5c 06 50 18 ...Z.......-\.P.
0030 16 d0 79 81 00 00 30 38 31 35 49 46 4d 20 45 4c ..y...0815IFM EL
0040 45 43 54 52 4f 4e 49 43 09 4f 32 44 32 32 30 41 ECTRONIC.O2D220A
0050 48 09 4e 65 77 20 73 65 6e 73 6f 72 09 4e 65 77 H.New sensor.New
0060 20 6c 6f 63 61 74 69 6f 6e 09 31 39 32 2e 31 36 location.192.16
0070 38 2e 30 2e 34 39 09 32 35 35 2e 32 35 35 2e 32 8.0.49.255.255.2
0080 35 35 2e 30 09 31 39 32 2e 31 36 38 2e 30 2e 32 55.0.192.168.0.2
0090 30 31 09 30 30 3a 30 32 3a 30 31 3a 32 31 3a 34 01.00:02:01:21:4
00a0 31 3a 36 31 09 30 09 30 38 30 38 30 0d 0a 1:61.0.08080..
Und nun hier einmal ein Paket vom Bild(erstes Paket):
0000 30 85 a9 15 9e b9 00 02 01 21 41 61 08 00 45 00 0........!Aa..E.
0010 05 dc 98 0f 40 00 40 06 1b 76 c0 a8 00 31 c0 a8 ....@.@..v...1..
0020 00 15 c3 5a 06 dc 2c 1a 8e 84 01 11 c8 77 50 10 ...Z..,......wP.
0030 16 d0 6b c9 00 00 30 38 31 35 30 30 30 33 30 38 ..k...0815000308
0040 32 37 38 42 4d 36 b4 04 00 00 00 00 00 36 04 00 278BM6.......6..
0050 00 28 00 00 00 80 02 00 00 e0 01 00 00 01 00 08 .(..............
0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0070 00 00 01 00 00 00 00 00 00 00 00 00 00 01 01 01 ................
0080 01 02 02 02 02 03 03 03 03 04 04 04 04 05 05 05 ................
0090 05 06 06 06 06 07 07 07 07 08 08 08 08 09 09 09 ................
00a0 09 0a 0a 0a 0a 0b 0b 0b 0b 0c 0c 0c 0c 0d 0d 0d ................
00b0 0d 0e 0e 0e 0e 0f 0f 0f 0f 10 10 10 10 11 11 11 ................
00c0 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 ................
00d0 15 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 ................
00e0 19 1a 1a 1a 1a 1b 1b 1b 1b 1c 1c 1c 1c 1d 1d 1d ................
00f0 1d 1e 1e 1e 1e 1f 1f 1f 1f 20 20 20 20 21 21 21 ......... !!!
0100 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 !""""####$$$$%%%
0110 25 26 26 26 26 27 27 27 27 28 28 28 28 29 29 29 %&&&&''''(((()))
0120 29 2a 2a 2a 2a 2b 2b 2b 2b 2c 2c 2c 2c 2d 2d 2d )****++++,,,,---
0130 2d 2e 2e 2e 2e 2f 2f 2f 2f 30 30 30 30 31 31 31 -....////0000111
0140 31 32 32 32 32 33 33 33 33 34 34 34 34 35 35 35 1222233334444555
0150 35 36 36 36 36 37 37 37 37 38 38 38 38 39 39 39 5666677778888999
0160 39 3a 3a 3a 3a 3b 3b 3b 3b 3c 3c 3c 3c 3d 3d 3d 9::::;;;;<<<<===
0170 3d 3e 3e 3e 3e 3f 3f 3f 3f 40 40 40 40 41 41 41 =>>>>????@@@@AAA
0180 41 42 42 42 42 43 43 43 43 44 44 44 44 45 45 45 ABBBBCCCCDDDDEEE
0190 45 46 46 46 46 47 47 47 47 48 48 48 48 49 49 49 EFFFFGGGGHHHHIII
01a0 49 4a 4a 4a 4a 4b 4b 4b 4b 4c 4c 4c 4c 4d 4d 4d IJJJJKKKKLLLLMMM
01b0 4d 4e 4e 4e 4e 4f 4f 4f 4f 50 50 50 50 51 51 51 MNNNNOOOOPPPPQQQ
01c0 51 52 52 52 52 53 53 53 53 54 54 54 54 55 55 55 QRRRRSSSSTTTTUUU
01d0 55 56 56 56 56 57 57 57 57 58 58 58 58 59 59 59 UVVVVWWWWXXXXYYY
01e0 59 5a 5a 5a 5a 5b 5b 5b 5b 5c 5c 5c 5c 5d 5d 5d YZZZZ[[[[\\\\]]]
01f0 5d 5e 5e 5e 5e 5f 5f 5f 5f 60 60 60 60 61 61 61 ]^^^^____````aaa
0200 61 62 62 62 62 63 63 63 63 64 64 64 64 65 65 65 abbbbccccddddeee
0210 65 66 66 66 66 67 67 67 67 68 68 68 68 69 69 69 effffgggghhhhiii
0220 69 6a 6a 6a 6a 6b 6b 6b 6b 6c 6c 6c 6c 6d 6d 6d ijjjjkkkkllllmmm
0230 6d 6e 6e 6e 6e 6f 6f 6f 6f 70 70 70 70 71 71 71 mnnnnooooppppqqq
0240 71 72 72 72 72 73 73 73 73 74 74 74 74 75 75 75 qrrrrssssttttuuu
0250 75 76 76 76 76 77 77 77 77 78 78 78 78 79 79 79 uvvvvwwwwxxxxyyy
0260 79 7a 7a 7a 7a 7b 7b 7b 7b 7c 7c 7c 7c 7d 7d 7d yzzzz{{{{||||}}}
0270 7d 7e 7e 7e 7e 7f 7f 7f 7f 80 80 80 80 81 81 81 }~~~~...........
0280 81 82 82 82 82 83 83 83 83 84 84 84 84 85 85 85 ................
0290 85 86 86 86 86 87 87 87 87 88 88 88 88 89 89 89 ................
02a0 89 8a 8a 8a 8a 8b 8b 8b 8b 8c 8c 8c 8c 8d 8d 8d ................
02b0 8d 8e 8e 8e 8e 8f 8f 8f 8f 90 90 90 90 91 91 91 ................
02c0 91 92 92 92 92 93 93 93 93 94 94 94 94 95 95 95 ................
02d0 95 96 96 96 96 97 97 97 97 98 98 98 98 99 99 99 ................
02e0 99 9a 9a 9a 9a 9b 9b 9b 9b 9c 9c 9c 9c 9d 9d 9d ................
02f0 9d 9e 9e 9e 9e 9f 9f 9f 9f a0 a0 a0 a0 a1 a1 a1 ................
0300 a1 a2 a2 a2 a2 a3 a3 a3 a3 a4 a4 a4 a4 a5 a5 a5 ................
0310 a5 a6 a6 a6 a6 a7 a7 a7 a7 a8 a8 a8 a8 a9 a9 a9 ................
0320 a9 aa aa aa aa ab ab ab ab ac ac ac ac ad ad ad ................
0330 ad ae ae ae ae af af af af b0 b0 b0 b0 b1 b1 b1 ................
0340 b1 b2 b2 b2 b2 b3 b3 b3 b3 b4 b4 b4 b4 b5 b5 b5 ................
0350 b5 b6 b6 b6 b6 b7 b7 b7 b7 b8 b8 b8 b8 b9 b9 b9 ................
0360 b9 ba ba ba ba bb bb bb bb bc bc bc bc bd bd bd ................
0370 bd be be be be bf bf bf bf c0 c0 c0 c0 c1 c1 c1 ................
0380 c1 c2 c2 c2 c2 c3 c3 c3 c3 c4 c4 c4 c4 c5 c5 c5 ................
0390 c5 c6 c6 c6 c6 c7 c7 c7 c7 c8 c8 c8 c8 c9 c9 c9 ................
03a0 c9 ca ca ca ca cb cb cb cb cc cc cc cc cd cd cd ................
03b0 cd ce ce ce ce cf cf cf cf d0 d0 d0 d0 d1 d1 d1 ................
03c0 d1 d2 d2 d2 d2 d3 d3 d3 d3 d4 d4 d4 d4 d5 d5 d5 ................
03d0 d5 d6 d6 d6 d6 d7 d7 d7 d7 d8 d8 d8 d8 d9 d9 d9 ................
03e0 d9 da da da da db db db db dc dc dc dc dd dd dd ................
03f0 dd de de de de df df df df e0 e0 e0 e0 e1 e1 e1 ................
0400 e1 e2 e2 e2 e2 e3 e3 e3 e3 e4 e4 e4 e4 e5 e5 e5 ................
0410 e5 e6 e6 e6 e6 e7 e7 e7 e7 e8 e8 e8 e8 e9 e9 e9 ................
0420 e9 ea ea ea ea eb eb eb eb ec ec ec ec ed ed ed ................
0430 ed ee ee ee ee ef ef ef ef f0 f0 f0 f0 f1 f1 f1 ................
0440 f1 f2 f2 f2 f2 f3 f3 f3 f3 f4 f4 f4 f4 f5 f5 f5 ................
0450 f5 f6 f6 f6 f6 f7 f7 f7 f7 f8 f8 f8 f8 f9 f9 f9 ................
0460 f9 fa fa fa fa fb fb fb fb fc fc fc fc fd fd fd ................
0470 fd fe fe fe fe ff ff ff ff 0d 0d 0e 0d 0f 0e 0d ................
0480 0e 0e 0d 0d 0e 0d 0e 0d 0e 0f 0e 0e 0d 0d 0e 0e ................
0490 0e 0e 0e 0d 0e 0f 0f 0f 11 0d 0f 0e 0d 0d 0e 0e ................
04a0 0d 0e 0e 0d 0d 0d 0e 0f 0e 0f 0e 0d 0d 0e 0e 0f ................
04b0 0e 0e 0d 10 0d 0d 0d 0d 0d 0d 0d 0e 0d 0d 0d 0e ................
04c0 0d 0e 0d 0e 0d 0e 0e 0d 0e 0e 0d 0d 0e 0f 0e 11 ................
04d0 0e 0f 0e 11 0e 0e 0f 0e 10 0f 0d 0e 0e 0d 0e 0d ................
04e0 0d 0d 0d 0e 10 0e 0d 0d 0e 0e 0e 0f 0d 0e 0d 0f ................
04f0 0e 0f 0e 0d 0d 0e 0e 0e 0e 0e 0f 0e 0e 0e 0e 0d ................
0500 0e 0e 0d 0e 0e 0d 0d 0d 0d 0e 0e 0e 0f 0f 0e 0d ................
0510 0d 0d 0d 0d 0f 0d 0d 0d 0d 0d 0e 0e 0d 0f 0e 0e ................
0520 0d 0f 0d 0d 0e 0e 0d 0d 0d 0d 0e 0d 0d 0f 0d 0d ................
0530 0e 0d 0e 0d 0e 0d 0d 0e 0e 0d 0d 0e 0e 0e 0e 0e ................
0540 0e 0f 0f 0e 0e 0e 0e 0f 0d 0e 0e 0f 0e 0f 0e 0e ................
0550 0f 10 0e 11 0e 0e 0e 0f 0e 0f 0e 0d 0e 0e 0e 0e ................
0560 0f 0e 0e 0f 0f 0e 10 0e 0e 0e 0e 0e 0d 0d 0d 0d ................
0570 0e 0d 0e 0d 0d 0d 0e 0d 0d 0d 0d 0d 0d 0d 0e 0e ................
0580 0d 0d 0d 0e 11 0f 0d 0d 0f 0e 0d 0d 0d 0e 0f 0e ................
0590 0e 0e 0d 0f 0d 0d 0e 0e 0d 0d 0f 0e 0f 0d 0f 0e ................
05a0 0e 0e 0d 0d 0d 0e 0e 0e 0e 0d 0e 0e 0d 0d 0d 0e ................
05b0 0d 0d 0d 0e 0e 0f 0e 0e 0e 0d 0e 0e 0e 0e 0e 0e ................
05c0 0d 0d 0e 0d 0d 0d 0d 0f 0d 0e 0d 0f 0f 0e 0d 0d ................
05d0 0d 0d 0d 0e 0e 0d 0e 10 0e 0f 0e 0e 0e 0d 0d 0e ................
05e0 0e 0e 0f 0d 0f 0e 0d 0d 0f 0e ..........
(Als Ticket wurde "0815" verwendet.)
Ich bin leider total überfordert damit, die Länge des Bitmaps auszulesen und alle Pakete zu empfangen, bis das Bild vollständig empfangen wurde.
Wenn ich es richtig sehe, sollte die Länge 000308278 Bytes sein?
Das Bildformat wurde im Sensor auf "Windows Bitmap" konfiguriert.
Gruß
M@tz3
Hallo M@tz3,
while ((_Text += (char)stream.ReadByte()).Last() != 10)
das ist suboptimal. Schau dir die StreamReader
-Klasse an -> das ist der bevorzugte Weg um das zu erledigen.
Strings mit += zu verketten ist nicht gut, da immer ein neues Objekt erstellt wird. Besser wäre -- falls es keine Alternative gibt -- mit dem StringBuilder
zu arbeiten.
Probier den Stream "abzuteilen", also die Position dorthin zu setzen wo du glaubst, dass die Bilddaten losgehen. Schau dir dazu die Methoden der Stream-Klasse an.
Dann kannst du per Image.FromStream
-Methode das Bild laden.
Das ist zwar mehr Trial & Error als gezieltes Vorgehen, aber so solltest du es schaffen.
In der Protokoll-Beschreibung gibt es keine näheren Infos dazu?
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Also die Protokollbeschreibung würde ich als ausreichend sehen.
Es kommen die Daten 4 Bytes Ticketnummer, 9 Bytes Datenlänge + Bilddaten
Somit musst du insgesamt Datenlänge + 13 Bytes empfangen.
Ich hab dir mal einen alten Client von mir angehängt.
private CommunicationClient ServerConnection = new CommunicationClient();
ServerConnection.ServerIP = deineServerIP;
ServerConnection.Port = deinTcpPort;
ServerConnection.ConnectEvent += new EventHandler(ServerConnection_ConnectEvent);
ServerConnection.DisconnectEvent += new EventHandler(ServerConnection_DisconnectEvent);
ServerConnection.NewMessageEvent += new CommunicationClient.mEventHandler(ServerConnection_NewMessageEvent);
ServerConnection.NewLogEvent += new CommunicationClient.mLogEventHandler(ServerConnection_NewLogEvent);
ServerConnection.StartClient();
Damit bekommst du die Bytes im Event übertragen
in dem Event kannst du dann die Nachricht prüfen z.B.
int ticketID;
int DataLenght;
int.TryParse(Encoding.ASCII.GetString(message, 0, 4), out ticketD);
int.TryParse(Encoding.ASCII.GetString(message, 4, 9), out DataLenght);
Wenn die Empfangenen Daten < der berechneten Datenlänge ist, die nächten Daten anhängen, wenn alle Daten da sind, die dann weiterverarbeiten.
Hallo MartinH,
dein Client scheint gut zu funktionieren und empfängt auch Daten.
Aber ich stehe noch auf dem Schlauch wie ich diese nun aneinander reihen und die Länge ermitteln kann.
Könntest du mir da eventuell eine Hilfestellung geben?
Hallo,
ich habe bis jetzt, wenn neue Daten empfangen werden zum Testen ob was empfangen wird, bis jetzt das:
int ticketID;
int DataLenght;
int.TryParse(Encoding.ASCII.GetString(message, 0, 4), out ticketID);
int.TryParse(Encoding.ASCII.GetString(message, 4, 9), out DataLenght);
listBox1.Items.Add(ByteArrayToString(message));
Nur ist mir noch nicht klar, wie ich die Daten in ein Array aneinander reihen kann.
Und ist es möglich mit der .Length Eigenschaft eines Arrays die "gefüllte" Länge zu ermitteln oder wird damit nur die maximale Länge ermittelt?
Ausserdem muss ich für die richtige Darstellung ja noch das Ticket und die Länge am Anfang entfernen, wie könnte ich das machen?
Du kannst doch einfach die Daten in eine List<byte> über .AddRange anhängen.
Bei erreichter Länge über .ToArray() das Byte-Array für das Bitmap erstellen.
Hallo 😃
nun scheint es zu funktionieren. Ich werde nun für alle Übertragungen an den Sensor deinen Client benutzen 😉 UM zu unterscheiden, ob es sich um ein Bild oder eine andere Nachricht handelt, verwende ich ein anderes Ticket bei den Bildern.
Es sieht nun folgendermaßen aus:
private void RequestPictureFromSensor()
{
BMPList.Clear();
ServerConnection.StartClient();
ServerConnection.Send_Data(StringToByteArray("1111t\r\n"));
WindowFunctions.WaitTime(100);
ServerConnection.Send_Data(StringToByteArray("2222I?\r\n"));
}
private void ServerConnection_NewMessageEvent(byte[] message)
{
if (ByteArrayToString(message).StartsWith("1111"))
{
}
else if (ByteArrayToString(message).StartsWith("2222"))
{
int.TryParse(Encoding.ASCII.GetString(message, 0, 4), out ticketID);
int.TryParse(Encoding.ASCII.GetString(message, 4, 9), out DataLenght);
followingimagedata = true;
BMPList.AddRange(message);
}
else
{
if (followingimagedata)
{
BMPList.AddRange(message);
if (BMPList.Count >= DataLenght + 13)
{
followingimagedata = false;
ServerConnection.EndClient = true;
ProcessImageData();
}
}
}
}
private void ProcessImageData()
{
BMPList.RemoveRange(0, 13);
byte[] bmparray = BMPList.ToArray();
pictureBox1.Image = byteArrayToImage(bmparray);
}
Somit kann ich auch noch andere Nachrichten abfragen und verarbeiten, je nach Art der Nachricht mit anderer Ticketnummer.
Vielen Dank euch zwei für eure Hilfe 😃
Edit: Eine Frage noch: Kann man bei deinem Client irgendwie abfragen, ob die Verbindung aktuell aktiv ist. Und gibt es eine Funktion zum Trennen der Verbindung?
Verbindung trennen must du dir noch selbst einbauen.
Du bekommst ja den Connect und Disconnect Event, damit kennst du den Verbindungszustand. Das Problem sind Verbindungsabbrüche wenn der Server (dein Sensor) z.B. ausgesteckt wird. Dann bekommst du das erst mit dem nächsten Senden von Daten mit.
Mir scheint es leider so, als würde nach dem Verbinden das Disconnect Ereignis aufgerufen werden, obwohl die Verbindung erfolgreich hergestellt wurde.
Sieht in meinem Log so aus:
[16.10.2016 12:13:35] Sensoreinstellungen übernommen!
[16.10.2016 12:13:35] Anwendung gestartet...
[16.10.2016 12:13:45] Sensoreinstellungen übernommen!
[16.10.2016 12:13:45] : Connected to Server...
[16.10.2016 12:13:45] Verbindung getrennt!
[16.10.2016 12:13:59] Sensoreinstellungen übernommen!
[16.10.2016 12:13:59] Socket: Client 192.168.0.49:50010, disconnected
[16.10.2016 12:13:59] : Connected to Server...
[16.10.2016 12:13:59] Verbindung getrennt!
[16.10.2016 12:13:59] Socket: Unusual error druing Recieve! Auf das verworfene Objekt kann nicht zugegriffen werden. Objektname: "System.Net.Sockets.Socket".
[16.10.2016 12:13:59] Verbindung hergestellt!
Wie würdest du das mit dem Disconnect realisieren?
Ich dachte da schon an deine RestartServer Methode, diese könnte man doch anpassen auf Disconnect?
Da machst du noch was falsch.
Poste doch mal deinen Code.
der Client verbindet sich mit dem Server, bei einem Disconnect wird versucht
den Server wieder zu erreichen.
Nach dem Connect-Event kannst du die Daten senden.
Für den Disconnect (wenn nötig) erweiter doch einfach den Client mit einem Disconnect. Das Socket-Objekt hat doch die Methode Disconnect.