3 pièce(s) jointe(s)
petit problème avec Socket.Avalaible en C#
Bonjour,
Je développe actuellement un mini-chat en c# pour étudier les Socket. Voilà, ce que je voudrai faire c'est un chat clients-serveur.
Le problème est côté client, j'ai fait 2 MessageBox successifs qui affiche des valeurs différentes :
MessageBox.Show("ClientSocket.Avalaible = " +ClientSocket.Avalaible); //affiche : ClientSocket.Avalaible = 49
MessageBox.Show("ClientSocket.Avalaible = " +ClientSocket.Avalaible); //affiche : ClientSocket.Avalaible = 0
je ne comprend pas! Alors que les 2 instructions se suivent :?
Voici en pièces jointes mes 3 Form.
Le problème se trouve dans FormDiscussion -> CheckData()
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
private void CheckData()
{
try
{
while (true)
{
if (ClientSocket.Connected)
{
if (ClientSocket.Poll(10, SelectMode.SelectRead) && ClientSocket.Available == 0)
{
//La connexion a été cloturée par le serveur ou bien un problème
//réseau est apparu
MessageBox.Show("La connexion au serveur est interrompue. Essayez avec un autre pseudo");
Thread.CurrentThread.Abort();
}
//Si la socket a des données à lire
if (ClientSocket.Available > 0)
{
string messageReceived = null;
MessageBox.Show("ClientSocket.Available : " + ClientSocket.Available + " " + pseudo);
MessageBox.Show("ClientSocket.Available : " + ClientSocket.Available + " " + pseudo);
while (ClientSocket.Available > 0)
{
try
{
byte[] msg = new Byte[2000];
//Réception des données
ClientSocket.Receive(msg, 0, ClientSocket.Available, SocketFlags.None);
messageReceived = System.Text.Encoding.ASCII.GetString(msg).Trim();
MessageBox.Show("MessageReceived :"+messageReceived);
//On concatène les données reçues(max 4ko) dans
//une variable de la classe
rtfContent += messageReceived;
}
catch (SocketException E)
{
MessageBox.Show("CheckData read" + E.Message);
}
}
try
{
//On remplit le richtextbox avec les données reçues
//lorsqu'on a tout réceptionné
Discussion(rtfStart + rtfContent);
}
catch (Exception E)
{
MessageBox.Show(E.Message);
}
}
}
//On temporise pendant 10 millisecondes, ceci pour éviter
//que le micro processeur s'emballe
Thread.Sleep(10);
}
}
catch (Exception e)
{
//Ce thread étant susceptible d'être arrêté à tout moment
//on catch l'exception afin de ne pas afficher un message à l'utilisateur
Thread.ResetAbort();
MessageBox.Show(e.Message);
}
} |