[tcp]Gestion de la deconnexion

Résolu
Signaler
Messages postés
54
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
13 mars 2007
-
Messages postés
54
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
13 mars 2007
-
Voila, j'ai un serveur TCP auquel vient se connecter un client (marrant non ?)
J'aimerais quand je ferme le client que le serveur se remette en écoute (sachant que le serveur est du genre a envoyer des informations dans une boucle while(true)).

Comment réussir ceci ?

Merci d'avance !

4 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
Lance un Thread dans lequel tu fais :



if (tonSocket.Poll(20, SelectedMode.SelectedRead) && tonSocket.Available == 0)

// ton client est deconnecté


Si ton client est déco, tu relances ton écoute


Mx
Messages postés
54
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
13 mars 2007

La feinte c'est que je fais du TCP avec TCPClient, il faut que je regarde si y'a un truc poll dessus aussi.
Messages postés
54
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
13 mars 2007

En fait je pige pas trop comment intégrer la solution.

J'ai une classe genre avec du TCPClient qui en gros est comme ca :

while(true)
{
sendLoc(j);
}
public void sendLoc(Joueur j)
{
int i=1;
serveurStreamWriter.WriteLine(i);
serveurStreamWriter.WriteLine(j.num);
serveurStreamWriter.WriteLine(j.etat);
serveurStreamWriter.WriteLine(j.type);
serveurStreamWriter.WriteLine(j.piece);
serveurStreamWriter.WriteLine(i);
serveurStreamWriter.WriteLine(i);
serveurStreamWriter.WriteLine(i);
serveurStreamWriter.Flush();
}

Si j'ai bien compris je dois lancer avant ma boucle while(true) un thread qui fait le if... mais faut il que je lui passe ma classe d'écoute en parametre et que j'encapsule ma boucle while pour relancer la méthode dans l'autre thread ?

Merci !
Messages postés
54
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
13 mars 2007

Je reviens avec la source de mon truc complete :

using System.Net.Sockets;
using System.IO;
using System;
using System.Configuration;
using System.Threading;


namespace cs_cenzub
{
/// <summary>
/// Summary description for ServerIHM.
/// </summary>
public class ServerIHM
{
private StreamWriter serverStreamWriter;
private StreamReader serverStreamReader;
private int port=int.Parse((string)ConfigurationSettings.AppSettings["portIHM"]);
private Joueur _j1, _j2, _j3;


public ServerIHM(ref Joueur j1, ref Joueur j2, ref Joueur j3)
{
_j1=j1;
_j2=j2;
_j3=j3;
}


public void Start()
{
//Création du serveur
TcpListener tcpServerListener = new TcpListener(port);
tcpServerListener.Start(); //start server
Console.WriteLine("Serveur d'ihm lancé");
Socket serverSocket = tcpServerListener.AcceptSocket();


try
{
if (serverSocket.Connected)
{
Console.WriteLine("Client connecté");
//open network stream on accepted socket
NetworkStream serverSockStream =
new NetworkStream(serverSocket);
serverStreamWriter =
new StreamWriter(serverSockStream);
serverStreamReader =
new StreamReader(serverSockStream);
}
}
catch(Exception e)
{
Console.WriteLine(e.StackTrace);
}
// Ici si j'ai bien compris je lance un thread d'écoute, que je mette ma boucle while(true) en méthode, pour la rappeler si la condition du if se dégage ?
while(true)
{
this.SendLoc(this._j1);
this.SendLoc(this._j2);
this.SendLoc(this._j3);
this.serverStreamWriter.Flush();
Thread.Sleep(50);
}
public void SendLoc(Joueur j)
{
serverStreamWriter.WriteLine(j.num);
serverStreamWriter.WriteLine(j.type);
serverStreamWriter.WriteLine(j.etat);
serverStreamWriter.WriteLine(j.piece);
serverStreamWriter.WriteLine(j.WifiX);
serverStreamWriter.WriteLine(j.WifiY);
serverStreamWriter.WriteLine(j.WifiErr);
}
}
}