using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace MonClient { public partial class FormDiscussion : Form { public Socket ClientSocket; public String pseudo; public String pseudoDestinataire; public Thread DataReceived = null; public long sequence; private const string rtfStart = "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fswiss\\fcharset0 Arial;}{\\f1\\fswiss\\fprq2\\fcharset0 Arial;}}{\\colortbl ;\\red0\\green0\\blue128;\\red0\\green128\\blue0;}\\viewkind4\\uc1"; private string rtfContent = null; public FormDiscussion() { InitializeComponent(); } private void btnConnexion_Click(object sender, EventArgs e) { string dest = ""; char pad1 = Convert.ToChar(" "); dest = dest.PadRight(15, pad1); this.Hide(); FormConversation fc = new FormConversation(); DataReceived.Abort(); SendMsg(GetSequence() + pseudo + dest + "Liste des persos Connectees"); fc.Show(); } private void FormDiscussion_Load(object sender, EventArgs e) { textChat.Clear(); textMsgAEnvoyer.Clear(); try { DataReceived = new Thread(new ThreadStart(CheckData)); DataReceived.Start(); } catch (Exception E) { MessageBox.Show("Démarrage Thread" + E.Message); } } void SendMsg(string message) { byte[] msg = System.Text.Encoding.ASCII.GetBytes(message); int DtSent = ClientSocket.Send(msg, msg.Length, SocketFlags.None); if (DtSent == 0) { MessageBox.Show("Aucune donnée n'a été envoyée"); } } private void btnEnvoyer_Click(object sender, EventArgs e) { //On vérifie que le client est bien connecté if (ClientSocket == null || !ClientSocket.Connected) { MessageBox.Show("Vous n'etes pas connecté"); return; } try { if (textMsgAEnvoyer.Text != "") { //Etant donné qu'on travaille en RTF, on échappe les caractères //spéciaux avant de les envoyer sur le serveur qui nous renverra //le message ainsi qu'aux autres clients connectés //Si vous travaillez en mode texte, vous n'aurez pas à vous soucier //de tout cela string reformattedBuffer = textMsgAEnvoyer.Text.Replace("}", "\\}")+"\n"; reformattedBuffer = reformattedBuffer.Replace("\n", "\\par\r\n"); //Chaque message est précédé d'un numéro de séquence, ce qui permet //de vérifier si le client vient de se connecter ou non SendMsg(GetSequence() + pseudo + pseudoDestinataire + reformattedBuffer.Replace("{", "\\{")); textMsgAEnvoyer.Clear(); } } catch (Exception E) { MessageBox.Show("SendMessage:" + E.Message); } } void HandleAutoScroll(object sender, System.EventArgs e) { textChat.SelectionStart = textChat.Rtf.Length; textChat.Focus(); textMsgAEnvoyer.Focus(); } string GetSequence() { sequence++; string msgSeq = Convert.ToString(sequence); char pad = Convert.ToChar("0"); msgSeq = msgSeq.PadLeft(6, pad); return msgSeq; } private void OnClosing(object sender, System.ComponentModel.CancelEventArgs e) { if (DataReceived != null) { try { DataReceived.Abort(); DataReceived.Join(); } catch (Exception E) { MessageBox.Show("Arret Thread etoo ve? " + E.Message); } } if (ClientSocket != null && ClientSocket.Connected) { try { ClientSocket.Shutdown(SocketShutdown.Both); ClientSocket.Close(); if (ClientSocket.Connected) { MessageBox.Show("Erreur: " + Convert.ToString(System.Runtime.InteropServices.Marshal.GetLastWin32Error())); } } catch (SocketException SE) { MessageBox.Show("SE" + SE.Message); } } } private void Discussion(string mess) { if (textChat.InvokeRequired) { textChat.Invoke(new DiscussionDelegate(() => textChat.Rtf+=mess)); } else { textChat.Rtf+=mess; } } public delegate void DiscussionDelegate(); 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 ambony :" + ClientSocket.Available); MessageBox.Show("ClientSocket.Available : " + ClientSocket.Available+" "+pseudo); MessageBox.Show("ClientSocket.Available ambany :" + ClientSocket.Available); */ MessageBox.Show("ClientSocket.Available : " + ClientSocket.Available + " " + pseudo); MessageBox.Show("ClientSocket.Available : " + ClientSocket.Available + " " + pseudo); while (ClientSocket.Available > 0) { //MessageBox.Show("tafiditra vô?"); 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 { //MessageBox.Show("mameno tableau :"+messageReceived); //On remplit le richtextbox avec les données reçues //lorsqu'on a tout réceptionné Discussion(rtfStart + rtfContent); MessageBox.Show("tafiditra manoratra"+ rtfContent); } catch (Exception E) { MessageBox.Show("Manoratra @ rich :"+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("ts aiko : "+e.Message); } } private void textMsgAEnvoyer_TextChanged(object sender, EventArgs e) { } } }