Je ces ici méthodes:TcpClient - Comment se connecter correctement, maintenir la connexion et enfin déconnecter
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();
}
}
tout cela fonctionne, mais quelque chose qui ne va pas. Quand je déconnecte le outputWindow obtient beaucoup de nouvelles lignes avant de dire finalement "Client: Déconnecté." Plus je reste connecté au serveur, plus la déconnexion est longue. Je crois que la minuterie a quelque chose à voir avec ce problème. Le travail de la minuterie consiste à demander en continu des données au serveur et à les sortir si l'un d'entre eux est reçu. Y a-t-il une meilleure façon de le faire? Peut-être "attendez que le serveur envoie des données" - dans le cas où rien ne sera envoyé pendant plusieurs secondes, je n'aurai pas à marteler le serveur pour les demandes.
Le nouveau thread de la méthode getDataFromServer est-il pris en charge par le garbage collector? Ou dois-je en disposer d'une manière ou d'une autre? (Pour ne pas créer tout un tas de threads d'arrière-plan.)
Voici un autre exemple simple https://stackoverflow.com/questions/21510204/c-sharp-tcpclient-send-serialized-objects -using-separators –