Ich habe diese hier Methoden:TcpClient - Wie man richtig verbinden, Verbindung zu halten und trennen schließlich
private void connectToServer() {
client = new TcpClient(SERVER_IP, PORT_NO);
nwStream = client.GetStream();
writer = new StreamWriter(client.GetStream());
writer.AutoFlush = true;
connected = true;
getDataFromServer();
rtb_inputField.Select();
if (getDataTimer == null) {
getDataTimer = new System.Timers.Timer();
getDataTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
getDataTimer.Interval = 1000;
getDataTimer.Enabled = true;
}
}
private void disconnectFromServer() {
if (connected) {
writer.WriteLine("quit");
getDataTimer.Enabled = false;
getDataTimer.Dispose();
getDataTimer = null;
Thread.Sleep(1000); //Wait 1 second
nwStream.Close();
client.Close();
rtb_outputWindow.AppendText("\n\nClient: Disconnected.");
}
connected = false;
}
private void getDataFromServer() {
if (connected) {
new Thread(() => {
Thread.CurrentThread.IsBackground = true;
byte[] bytesToRead = new byte[client.ReceiveBufferSize];
int readData = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
updateOutputWindow(Encoding.Default.GetString(bytesToRead, 0, readData));
}).Start();
}
}
private void updateOutputWindow(string text) {
string newText = string.Empty;
if (InvokeRequired) {
Invoke(new MethodInvoker(delegate() {
updateOutputWindow(text);
}));
}
else {
newText = startRTFString;
newText += rtb_outputWindow.Rtf;
newText += replaceAnsiColorCodes(text);
rtb_outputWindow.Rtf = newText;
}
}
private void OnTimedEvent(object source, ElapsedEventArgs e) {
if (connected) {
getDataFromServer();
}
}
Dies alles funktioniert, aber etwas falsch ist. Wenn ich den outputWindow abbreche, bekommt er viele Zeilenumbrüche, bevor er schließlich "Client: Getrennt" sagt. Je länger ich mit dem Server verbunden bin, desto länger dauert die Verbindungstrennung.
Ich glaube, der Timer hat etwas mit diesem Problem zu tun. Die Aufgabe des Zeitgebers besteht darin, fortlaufend Daten vom Server anzufordern und sie auszugeben, falls solche empfangen werden. Gibt es einen besseren Weg? Vielleicht "warten Sie, bis der Server Daten sendet" - falls nichts für einige Sekunden gesendet wird, muss ich den Server nicht nach Anfragen hämmern.
Wird der neue Thread in der getDataFromServer-Methode vom Garbage Collector behandelt? Oder muss ich es irgendwie entsorgen? (Damit erlebe ich nicht eine ganze Reihe von Hintergrundthreads.)
Hier ist ein weiteres einfaches Beispiel https://stackoverflow.com/questions/21510204/c-sharp-tcpclient-send-serialized-objects -use-separators –