public void receiveMessageFromServer() { // Boucle de réception des messages du serveur byte[] buf = new byte[ChatLib.ChatLib.MESSAGE_MAX_SIZE]; ChatLib.MessageChat msg = null; while (true) { if (!finish) { try { int nbBytes = client.ClientSocket.Receive(buf); if (nbBytes > 0) { if (client.Connected && client.ClientSocket.Connected) { System.Diagnostics.Debug.WriteLine("FormMain received"); try { msg = ChatLib.ChatLib.createMessageFromString(ChatLib.ChatLib.GetString(buf, nbBytes)); System.Diagnostics.Debug.WriteLine(msg.MessageType); switch (msg.MessageType)// En fonction du type de message recu { case ChatLib.MessageType.ChatRoomExit:// Le serveur nous confirme que nous quittons la Chat Room if (msg.ContentMessage == "true") { this.Invoke((MethodInvoker)delegate { listFormChatRoom.Remove(listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName)); }); } break; case ChatLib.MessageType.PrivateChatExit: // Le serveur nous confirme que nous quittons la Chat Room privée if (msg.ContentMessage == "true") { this.Invoke((MethodInvoker)delegate { listFormChatPrivate.Remove(listFormChatPrivate.Find(x => x.PrivateChatName == msg.TargetName)); }); } break; case ChatLib.MessageType.ChatRoomJoin: // Le serveur nous confirme que nous nous connectons à une Chat Room if (msg.ContentMessage == "true") { this.Invoke((MethodInvoker)delegate { if (!listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { listFormChatRoom.Add(new FormChatRoom(msg.TargetName)); } listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName).Show(); }); } break; case ChatLib.MessageType.ChatRoomCreate: // Le serveur nous confirme que nous avons créé une Chat Room if (msg.ContentMessage == "true") { this.Invoke((MethodInvoker)delegate { if(!this.listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { this.formNewRoom_OnCreateNewChatRoom(msg.TargetName); } }); } break; case ChatLib.MessageType.ClientChatRoomMessage: // A la reception d'un message // Verifier parmis toutes les Chat Rooms ouvertes dans lesquels le client est connecté // Transférer le message à cette chat room if (listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { this.Invoke((MethodInvoker)delegate { FormChatRoom chat = listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName); chat.OnReceivedMessage(msg); }); } break; case ChatLib.MessageType.ClientChatRoomImage: // A la reception d'un message de type image if (listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { this.Invoke((MethodInvoker)delegate { FormChatRoom chat = listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName); chat.OnReceivedMessage(msg); }); } break; case ChatLib.MessageType.UpdateConnectedUsersInChatRoom: // Le serveur nous informe que la liste des utilisateurs connectés à une Chat Room précise a été mise à jour if (listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { this.Invoke((MethodInvoker)delegate { FormChatRoom chat = listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName); chat.UpdateConnectedUsersInChatRoom(msg); }); } break; case ChatLib.MessageType.UpdateChatRoomList: // Le serveur nous indique que la liste des Chat Rooms a été mise à jour if (msg.ContentMessage != "false") { this.Invoke((MethodInvoker)delegate { this.treeViewChatRooms.Nodes[0].Nodes.Clear(); // On vide la liste des Chat Rooms }); foreach (string chatRoom in msg.ContentMessage.Split('\\')) { // On réaffiche la liste des Chat Rooms if (chatRoom.Length > 0) { this.Invoke((MethodInvoker)delegate { this.formNewRoom_OnCreateNewChatRoom(chatRoom); }); } } } if (msg.ContentMessage == "false") { MessageBox.Show("You can't delete this Chat Room while users are still in it."); } break; case ChatLib.MessageType.PrivateChatCreate: // Le serveur nous confirme la création d'une Chat Room privée FormChatPrivate privchat = new FormChatPrivate(msg.SenderName); if (!this.listFormChatPrivate.Exists(x => x.PrivateChatName == msg.SenderName)) { this.Invoke((MethodInvoker)delegate { this.listFormChatPrivate.Add(privchat); this.listFormChatPrivate.Find(x => x.PrivateChatName == privchat.PrivateChatName).Show(); }); } break; case ChatLib.MessageType.ClientPrivateMessage: // A la réception d'un message privé if (listFormChatPrivate.Exists(x => x.PrivateChatName == msg.SenderName)) { this.Invoke((MethodInvoker)delegate { FormChatPrivate chat = listFormChatPrivate.Find(x => x.PrivateChatName == msg.SenderName); chat.OnReceivedMessage(msg); }); } break; case ChatLib.MessageType.ClientPrivateImage: // A la réception d'un message privé de type image if (listFormChatPrivate.Exists(x => x.PrivateChatName == msg.SenderName)) { this.Invoke((MethodInvoker)delegate { FormChatPrivate chat = listFormChatPrivate.Find(x => x.PrivateChatName == msg.SenderName); chat.OnReceivedMessage(msg); }); } break; case ChatLib.MessageType.UpdateConnectedUsers: // Le serveur nous indique que la liste des utlisateurs connectés a été mise à jour string[] users = msg.ContentMessage.Split('\\'); this.Invoke((MethodInvoker)delegate { this.treeViewClients.Nodes[0].Nodes.Clear(); // On vide la liste des utilisateurs connectés foreach (string s in users) { System.Diagnostics.Debug.WriteLine(s); if (s.Length > 0 && s != client.UserName) { this.treeViewClients.Nodes[0].Nodes.Add(new TreeNode(s)); } } this.treeViewClients.ExpandAll(); }); break; case ChatLib.MessageType.DisconnectFromServer: // Le serveur nous confirme notre déconnexion if (msg.ContentMessage == "true") { FormMain.client = null; finish = true; if (!this.IsDisposed) { this.Invoke((MethodInvoker)delegate { this.Text = "Chat Application"; this.menuStrip_Update(); }); } return; } break; } } catch (JsonReaderException) { } } else return; } } catch (SocketException) { } } else return; } }
public void receiveMessageFromServer() { // Boucle de réception des messages du serveur byte[] buf = new byte[ChatLib.ChatLib.MESSAGE_MAX_SIZE]; ChatLib.MessageChat msg = null; while (true) { if (!finish) { try { int nbBytes = client.ClientSocket.Receive(buf); if (nbBytes > 0) { if (client.Connected && client.ClientSocket.Connected) { System.Diagnostics.Debug.WriteLine("FormMain received"); try { msg = ChatLib.ChatLib.createMessageFromString(ChatLib.ChatLib.GetString(buf, nbBytes)); System.Diagnostics.Debug.WriteLine(msg.MessageType); switch (msg.MessageType) // En fonction du type de message recu { case ChatLib.MessageType.ChatRoomExit: // Le serveur nous confirme que nous quittons la Chat Room if (msg.ContentMessage == "true") { this.Invoke((MethodInvoker) delegate { listFormChatRoom.Remove(listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName)); }); } break; case ChatLib.MessageType.PrivateChatExit: // Le serveur nous confirme que nous quittons la Chat Room privée if (msg.ContentMessage == "true") { this.Invoke((MethodInvoker) delegate { listFormChatPrivate.Remove(listFormChatPrivate.Find(x => x.PrivateChatName == msg.TargetName)); }); } break; case ChatLib.MessageType.ChatRoomJoin: // Le serveur nous confirme que nous nous connectons à une Chat Room if (msg.ContentMessage == "true") { this.Invoke((MethodInvoker) delegate { if (!listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { listFormChatRoom.Add(new FormChatRoom(msg.TargetName)); } listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName).Show(); }); } break; case ChatLib.MessageType.ChatRoomCreate: // Le serveur nous confirme que nous avons créé une Chat Room if (msg.ContentMessage == "true") { this.Invoke((MethodInvoker) delegate { if (!this.listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { this.formNewRoom_OnCreateNewChatRoom(msg.TargetName); } }); } break; case ChatLib.MessageType.ClientChatRoomMessage: // A la reception d'un message // Verifier parmis toutes les Chat Rooms ouvertes dans lesquels le client est connecté // Transférer le message à cette chat room if (listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { this.Invoke((MethodInvoker) delegate { FormChatRoom chat = listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName); chat.OnReceivedMessage(msg); }); } break; case ChatLib.MessageType.ClientChatRoomImage: // A la reception d'un message de type image if (listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { this.Invoke((MethodInvoker) delegate { FormChatRoom chat = listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName); chat.OnReceivedMessage(msg); }); } break; case ChatLib.MessageType.UpdateConnectedUsersInChatRoom: // Le serveur nous informe que la liste des utilisateurs connectés à une Chat Room précise a été mise à jour if (listFormChatRoom.Exists(x => x.ChatRoomName == msg.TargetName)) { this.Invoke((MethodInvoker) delegate { FormChatRoom chat = listFormChatRoom.Find(x => x.ChatRoomName == msg.TargetName); chat.UpdateConnectedUsersInChatRoom(msg); }); } break; case ChatLib.MessageType.UpdateChatRoomList: // Le serveur nous indique que la liste des Chat Rooms a été mise à jour if (msg.ContentMessage != "false") { this.Invoke((MethodInvoker) delegate { this.treeViewChatRooms.Nodes[0].Nodes.Clear(); // On vide la liste des Chat Rooms }); foreach (string chatRoom in msg.ContentMessage.Split('\\')) { // On réaffiche la liste des Chat Rooms if (chatRoom.Length > 0) { this.Invoke((MethodInvoker) delegate { this.formNewRoom_OnCreateNewChatRoom(chatRoom); }); } } } if (msg.ContentMessage == "false") { MessageBox.Show("You can't delete this Chat Room while users are still in it."); } break; case ChatLib.MessageType.PrivateChatCreate: // Le serveur nous confirme la création d'une Chat Room privée FormChatPrivate privchat = new FormChatPrivate(msg.SenderName); if (!this.listFormChatPrivate.Exists(x => x.PrivateChatName == msg.SenderName)) { this.Invoke((MethodInvoker) delegate { this.listFormChatPrivate.Add(privchat); this.listFormChatPrivate.Find(x => x.PrivateChatName == privchat.PrivateChatName).Show(); }); } break; case ChatLib.MessageType.ClientPrivateMessage: // A la réception d'un message privé if (listFormChatPrivate.Exists(x => x.PrivateChatName == msg.SenderName)) { this.Invoke((MethodInvoker) delegate { FormChatPrivate chat = listFormChatPrivate.Find(x => x.PrivateChatName == msg.SenderName); chat.OnReceivedMessage(msg); }); } break; case ChatLib.MessageType.ClientPrivateImage: // A la réception d'un message privé de type image if (listFormChatPrivate.Exists(x => x.PrivateChatName == msg.SenderName)) { this.Invoke((MethodInvoker) delegate { FormChatPrivate chat = listFormChatPrivate.Find(x => x.PrivateChatName == msg.SenderName); chat.OnReceivedMessage(msg); }); } break; case ChatLib.MessageType.UpdateConnectedUsers: // Le serveur nous indique que la liste des utlisateurs connectés a été mise à jour string[] users = msg.ContentMessage.Split('\\'); this.Invoke((MethodInvoker) delegate { this.treeViewClients.Nodes[0].Nodes.Clear(); // On vide la liste des utilisateurs connectés foreach (string s in users) { System.Diagnostics.Debug.WriteLine(s); if (s.Length > 0 && s != client.UserName) { this.treeViewClients.Nodes[0].Nodes.Add(new TreeNode(s)); } } this.treeViewClients.ExpandAll(); }); break; case ChatLib.MessageType.DisconnectFromServer: // Le serveur nous confirme notre déconnexion if (msg.ContentMessage == "true") { FormMain.client = null; finish = true; if (!this.IsDisposed) { this.Invoke((MethodInvoker) delegate { this.Text = "Chat Application"; this.menuStrip_Update(); }); } return; } break; } } catch (JsonReaderException) { } } else { return; } } } catch (SocketException) { } } else { return; } } }