// Envoi d'un message au socket donné. Effectuer dans un autre thread public static void SendMessage(Socket socket, MessageChat msg) { BackgroundWorker bwSender = new BackgroundWorker(); bwSender.DoWork += new DoWorkEventHandler(bworkerSender); bwSender.RunWorkerAsync(new object[] { socket, msg }); }
private static void updateChatRoomList() { foreach (ConnectedUser user in connectedUserList) { //envoie de la liste de chatRoom ChatLib.MessageChat msgChatRoomList = new ChatLib.MessageChat(MessageType.UpdateChatRoomList, "server", user.name, splitChatRoomList(chatRoomList)); Console.WriteLine("send updateChatRoom to : " + user.name + " " + user.userSocket.ToString()); ChatLib.ChatLib.SendMessage(user.userSocket, msgChatRoomList); } }
private static void updateChatRoomUserList(string chatRoomName) { foreach (ConnectedUser user in connectedUserList) { if (user.chatRoomList.Exists(x => x.name == chatRoomName)) { //envoie de la liste de chatRoom ChatLib.MessageChat msgChatRoomList = new ChatLib.MessageChat(MessageType.UpdateConnectedUsersInChatRoom, "server", chatRoomName, splitChatRoomUserList(connectedUserList, chatRoomName)); Console.WriteLine("send updateChatRoomUserList to : " + user.name + " " + user.userSocket.ToString()); ChatLib.ChatLib.SendMessage(user.userSocket, msgChatRoomList); //envoie de la liste des utilisteurs connectés par chatRoom } } }
private static void bworkerSender(object sender, DoWorkEventArgs e) { object[] obj = e.Argument as object[]; Socket socket = obj[0] as Socket; MessageChat msg = obj[1] as MessageChat; // Bloque la ressource semaphor.WaitOne(); string json = JsonConvert.SerializeObject(msg); try { socket.Send(GetBytes(json)); } catch (SocketException) { Console.WriteLine("SocketException dans bworkerSender"); } // Libere la ressource semaphor.Release(); }
private static void launchNewSocketConnection(object obj) { Socket newSocket = (Socket)obj; Thread socketThread; object[] objects; String chatRoomName; if (newSocket != null) { while (newSocket.Connected) { byte[] MessageReceived = new byte[ChatLib.ChatLib.MESSAGE_MAX_SIZE]; try { // On attend de recevoir un msg provenant d'un client int nbBytes = newSocket.Receive(MessageReceived); if (newSocket.Connected) { // On recupere la requete envoye par un client string msgFromClient = ChatLib.ChatLib.GetString(MessageReceived, nbBytes); System.Diagnostics.Debug.WriteLine(msgFromClient); // On caste la requete en message ChatLib.MessageChat msg = ChatLib.ChatLib.createMessageFromString(msgFromClient.Trim()); if (msg != null) { Console.WriteLine(msg.MessageType.ToString()); // Suivant le type de message switch (msg.MessageType) { case MessageType.None: break; case MessageType.ClientPrivateMessage: semaphor.WaitOne(); ConnectedUser target; target = connectedUserList.Find(x => x.name == msg.TargetName); semaphor.Release(); Thread.Sleep(100); ChatLib.ChatLib.SendMessage(target.userSocket, msg); break; // Message texte case MessageType.ClientChatRoomMessage: semaphor.WaitOne(); String targetChatRoom = msg.TargetName; foreach (ConnectedUser user in connectedUserList) { if (user.chatRoomList.Exists(x => x.name == targetChatRoom)) { objects = new object[2] { user.userSocket, msg }; semaphor.Release(); socketThread = new Thread(new ParameterizedThreadStart(sendMessage)); socketThread.Start(objects); semaphor.WaitOne(); } } semaphor.Release(); break; // un client se log case MessageType.ConnectToServer: semaphor.WaitOne(); String userName = msg.SenderName; String userPassword = msg.ContentMessage; ChatLib.MessageChat msgLogIn = new ChatLib.MessageChat(MessageType.ConnectToServer, "server", msg.SenderName, "true"); foreach (User usr in userList) { Console.WriteLine("user : "******"pass : "******"user exists name log in : " + userName); if (userList.Find(x => x.name == userName).password.Equals(userPassword)) { Console.WriteLine("user exists pasword : " + userPassword); if (connectedUserList.Exists(x => x.name == userName)) { if (connectedUserList.Find(x => x.name == userName).userSocket.Connected) { connectedUserList.Find(x => x.name == userName).userSocket.Disconnect(true); } connectedUserList.Find(x => x.name == userName).userSocket = newSocket; } else { connectedUserList.Add(new ConnectedUser(userName, new List <ChatRoom>(), newSocket)); } semaphor.Release(); if (msgLogIn != null) { ChatLib.ChatLib.SendMessage(newSocket, msgLogIn); Thread.Sleep(100); updateChatRoomList(); Thread.Sleep(100); updateConnectedUserList(); } } else { semaphor.Release(); if (msgLogIn != null) { msgLogIn.ContentMessage = "false"; ChatLib.ChatLib.SendMessage(newSocket, msgLogIn); } newSocket.Disconnect(true); } } else { //Sinon on ajoute l'utilisateur à la liste des utilisateurs connectés connectedUserList.Add(new ConnectedUser(userName, new List <ChatRoom>(), newSocket)); userList.Add(new User(userName, userPassword)); semaphor.Release(); if (msgLogIn != null) { ChatLib.ChatLib.SendMessage(newSocket, msgLogIn); Thread.Sleep(100); updateChatRoomList(); Thread.Sleep(100); updateConnectedUserList(); } } break; // un client se déconnecte case MessageType.DisconnectFromServer: semaphor.WaitOne(); ConnectedUser c = connectedUserList.Find(x => x.name == msg.SenderName); connectedUserList.Remove(connectedUserList.Find(x => x.name == msg.SenderName)); semaphor.Release(); ChatLib.MessageChat msgDisconnectOK = new ChatLib.MessageChat(MessageType.DisconnectFromServer, "server", msg.SenderName, "true"); Thread.Sleep(100); updateConnectedUserList(); Thread.Sleep(100); if (msgDisconnectOK != null) { ChatLib.ChatLib.SendMessage(newSocket, msgDisconnectOK); } Thread.Sleep(100); foreach (ChatRoom chat in c.chatRoomList) { updateChatRoomUserList(chat.name); } Thread.Sleep(100); newSocket.Disconnect(true); break; //un client rejoint la ChatRoom case MessageType.ChatRoomJoin: semaphor.WaitOne(); chatRoomName = msg.ContentMessage; ChatLib.MessageChat msgJoinOK = new ChatLib.MessageChat(MessageType.ChatRoomJoin, msg.SenderName, chatRoomName, "true"); if (connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Exists(x => x.name == chatRoomName)) { msgJoinOK.ContentMessage = "false"; } else { if (!connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Exists(x => x.name == chatRoomName)) { connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Add(new ChatRoom(chatRoomName)); } } semaphor.Release(); Console.WriteLine(msgJoinOK.ContentMessage); if (msgJoinOK != null) { ChatLib.ChatLib.SendMessage(newSocket, msgJoinOK); Thread.Sleep(100); updateChatRoomUserList(chatRoomName); } break; //un client quitte la chatRoom case MessageType.ChatRoomExit: semaphor.WaitOne(); chatRoomName = msg.ContentMessage; connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Remove(connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Find(x => x.name == chatRoomName)); Thread.Sleep(100); semaphor.Release(); updateChatRoomUserList(chatRoomName); ChatLib.MessageChat msgExitOK = new ChatLib.MessageChat(MessageType.ChatRoomExit, msg.SenderName, chatRoomName, "true"); ChatLib.ChatLib.SendMessage(newSocket, msgExitOK); break; //supprimer un chatRoom case MessageType.ChatRoomDelete: semaphor.WaitOne(); chatRoomName = msg.TargetName; bool exist = false; foreach (ConnectedUser user in connectedUserList) { if (user.chatRoomList.Exists(x => x.name == chatRoomName)) { semaphor.Release(); //user.chatRoomList.Remove(user.chatRoomList.Find(x => x.name == chatRoomName)); exist = true; ChatLib.MessageChat msgChatRoomList = new ChatLib.MessageChat(MessageType.UpdateChatRoomList, "server", msg.SenderName, "false"); ChatLib.ChatLib.SendMessage(newSocket, msgChatRoomList); break; } } if (!exist) { semaphor.WaitOne(); chatRoomList.Remove(chatRoomList.Find(x => x.name == chatRoomName)); semaphor.Release(); updateChatRoomList(); } break; // un client créé un chat room case MessageType.ChatRoomCreate: chatRoomName = msg.ContentMessage; ChatLib.MessageChat msgCreateOK = new ChatLib.MessageChat(MessageType.ChatRoomCreate, msg.SenderName, chatRoomName, "true"); semaphor.WaitOne(); if (chatRoomList.Exists(x => x.name == chatRoomName)) { if (msgCreateOK != null) { msgCreateOK.ContentMessage = "false"; semaphor.Release(); } } else { chatRoomList.Add(new ChatRoom(chatRoomName)); semaphor.Release(); } updateChatRoomList(); ChatLib.ChatLib.SendMessage(newSocket, msgCreateOK); break; case MessageType.ClientPrivateImage: Console.WriteLine("PrivateImage processing"); ConnectedUser targetPrivateImage = connectedUserList.Find(x => x.name == msg.TargetName); Thread.Sleep(100); ChatLib.ChatLib.SendMessage(targetPrivateImage.userSocket, msg); Thread.Sleep(400); ChatLib.ChatLib.SendMessage(newSocket, msg); break; case MessageType.PrivateChatCreate: chatRoomName = msg.TargetName; ChatLib.MessageChat msgPrivateCreateOK = new ChatLib.MessageChat(MessageType.PrivateChatCreate, msg.TargetName, msg.SenderName, "true"); ChatLib.ChatLib.SendMessage(newSocket, msgPrivateCreateOK); ConnectedUser targetPrivateChat = connectedUserList.Find(x => x.name == chatRoomName); Thread.Sleep(100); ChatLib.ChatLib.SendMessage(targetPrivateChat.userSocket, new MessageChat(MessageType.PrivateChatCreate, msg.SenderName, msg.TargetName, "true")); break; case MessageType.PrivateChatExit: chatRoomName = msg.TargetName; ChatLib.MessageChat msgPrivateExitOK = new ChatLib.MessageChat(MessageType.PrivateChatExit, msg.SenderName, chatRoomName, "true"); ChatLib.ChatLib.SendMessage(newSocket, msgPrivateExitOK); break; case MessageType.ClientChatRoomImage: String targetImage = msg.TargetName; foreach (ConnectedUser user in connectedUserList) { if (user.chatRoomList.Exists(x => x.name == targetImage)) { objects = new object[2] { user.userSocket, msg }; socketThread = new Thread(new ParameterizedThreadStart(sendMessage)); socketThread.Start(objects); } } break; } } } else { break; } } catch (SocketException e) { Console.WriteLine("erreur socket" + e.ToString()); } } } }
private static void updateConnectedUserList() { foreach (ConnectedUser user in connectedUserList) { //envoie de la liste de chatRoom ChatLib.MessageChat msgChatRoomList = new ChatLib.MessageChat(MessageType.UpdateConnectedUsers, "server", user.name, splitConnectedUserList(connectedUserList)); Console.WriteLine("send updateConnectedUser to : " + user.name + " " + user.userSocket.ToString()); ChatLib.ChatLib.SendMessage(user.userSocket, msgChatRoomList); } }
private static void launchNewSocketConnection(object obj) { Socket newSocket = (Socket)obj; Thread socketThread; object[] objects; String chatRoomName; if (newSocket != null) { while (newSocket.Connected) { byte[] MessageReceived = new byte[ChatLib.ChatLib.MESSAGE_MAX_SIZE]; try { // On attend de recevoir un msg provenant d'un client int nbBytes = newSocket.Receive(MessageReceived); if (newSocket.Connected) { // On recupere la requete envoye par un client string msgFromClient = ChatLib.ChatLib.GetString(MessageReceived, nbBytes); System.Diagnostics.Debug.WriteLine(msgFromClient); // On caste la requete en message ChatLib.MessageChat msg = ChatLib.ChatLib.createMessageFromString(msgFromClient.Trim()); if (msg != null) { Console.WriteLine(msg.MessageType.ToString()); // Suivant le type de message switch (msg.MessageType) { case MessageType.None: break; case MessageType.ClientPrivateMessage: semaphor.WaitOne(); ConnectedUser target; target = connectedUserList.Find(x => x.name == msg.TargetName); semaphor.Release(); Thread.Sleep(100); ChatLib.ChatLib.SendMessage(target.userSocket, msg); break; // Message texte case MessageType.ClientChatRoomMessage: semaphor.WaitOne(); String targetChatRoom = msg.TargetName; foreach (ConnectedUser user in connectedUserList) { if (user.chatRoomList.Exists(x => x.name == targetChatRoom)) { objects = new object[2] { user.userSocket, msg }; semaphor.Release(); socketThread = new Thread(new ParameterizedThreadStart(sendMessage)); socketThread.Start(objects); semaphor.WaitOne(); } } semaphor.Release(); break; // un client se log case MessageType.ConnectToServer: semaphor.WaitOne(); String userName = msg.SenderName; String userPassword = msg.ContentMessage; ChatLib.MessageChat msgLogIn = new ChatLib.MessageChat(MessageType.ConnectToServer, "server", msg.SenderName, "true"); foreach (User usr in userList) { Console.WriteLine("user : "******"pass : "******"user exists name log in : " + userName); if (userList.Find(x => x.name == userName).password.Equals(userPassword)) { Console.WriteLine("user exists pasword : " + userPassword); if (connectedUserList.Exists(x => x.name == userName)) { if (connectedUserList.Find(x => x.name == userName).userSocket.Connected) { connectedUserList.Find(x => x.name == userName).userSocket.Disconnect(true); } connectedUserList.Find(x => x.name == userName).userSocket = newSocket; } else { connectedUserList.Add(new ConnectedUser(userName, new List<ChatRoom>(), newSocket)); } semaphor.Release(); if (msgLogIn != null) { ChatLib.ChatLib.SendMessage(newSocket, msgLogIn); Thread.Sleep(100); updateChatRoomList(); Thread.Sleep(100); updateConnectedUserList(); } } else { semaphor.Release(); if (msgLogIn != null) { msgLogIn.ContentMessage = "false"; ChatLib.ChatLib.SendMessage(newSocket, msgLogIn); } newSocket.Disconnect(true); } } else { //Sinon on ajoute l'utilisateur à la liste des utilisateurs connectés connectedUserList.Add(new ConnectedUser(userName, new List<ChatRoom>(), newSocket)); userList.Add(new User(userName, userPassword)); semaphor.Release(); if (msgLogIn != null) { ChatLib.ChatLib.SendMessage(newSocket, msgLogIn); Thread.Sleep(100); updateChatRoomList(); Thread.Sleep(100); updateConnectedUserList(); } } break; // un client se déconnecte case MessageType.DisconnectFromServer: semaphor.WaitOne(); ConnectedUser c = connectedUserList.Find(x => x.name == msg.SenderName); connectedUserList.Remove(connectedUserList.Find(x => x.name == msg.SenderName)); semaphor.Release(); ChatLib.MessageChat msgDisconnectOK = new ChatLib.MessageChat(MessageType.DisconnectFromServer, "server", msg.SenderName, "true"); Thread.Sleep(100); updateConnectedUserList(); Thread.Sleep(100); if (msgDisconnectOK != null) { ChatLib.ChatLib.SendMessage(newSocket, msgDisconnectOK); } Thread.Sleep(100); foreach (ChatRoom chat in c.chatRoomList) { updateChatRoomUserList(chat.name); } Thread.Sleep(100); newSocket.Disconnect(true); break; //un client rejoint la ChatRoom case MessageType.ChatRoomJoin: semaphor.WaitOne(); chatRoomName = msg.ContentMessage; ChatLib.MessageChat msgJoinOK = new ChatLib.MessageChat(MessageType.ChatRoomJoin, msg.SenderName, chatRoomName, "true"); if (connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Exists(x => x.name == chatRoomName)) msgJoinOK.ContentMessage = "false"; else { if (!connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Exists(x => x.name == chatRoomName)) { connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Add(new ChatRoom(chatRoomName)); } } semaphor.Release(); Console.WriteLine(msgJoinOK.ContentMessage); if (msgJoinOK != null) { ChatLib.ChatLib.SendMessage(newSocket, msgJoinOK); Thread.Sleep(100); updateChatRoomUserList(chatRoomName); } break; //un client quitte la chatRoom case MessageType.ChatRoomExit: semaphor.WaitOne(); chatRoomName = msg.ContentMessage; connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Remove(connectedUserList.Find(x => x.name == msg.SenderName).chatRoomList.Find(x => x.name == chatRoomName)); Thread.Sleep(100); semaphor.Release(); updateChatRoomUserList(chatRoomName); ChatLib.MessageChat msgExitOK = new ChatLib.MessageChat(MessageType.ChatRoomExit, msg.SenderName, chatRoomName, "true"); ChatLib.ChatLib.SendMessage(newSocket, msgExitOK); break; //supprimer un chatRoom case MessageType.ChatRoomDelete: semaphor.WaitOne(); chatRoomName = msg.TargetName; bool exist = false; foreach (ConnectedUser user in connectedUserList) { if (user.chatRoomList.Exists(x => x.name == chatRoomName)) { semaphor.Release(); //user.chatRoomList.Remove(user.chatRoomList.Find(x => x.name == chatRoomName)); exist = true; ChatLib.MessageChat msgChatRoomList = new ChatLib.MessageChat(MessageType.UpdateChatRoomList, "server", msg.SenderName, "false"); ChatLib.ChatLib.SendMessage(newSocket, msgChatRoomList); break; } } if (!exist) { semaphor.WaitOne(); chatRoomList.Remove(chatRoomList.Find(x => x.name == chatRoomName)); semaphor.Release(); updateChatRoomList(); } break; // un client créé un chat room case MessageType.ChatRoomCreate: chatRoomName = msg.ContentMessage; ChatLib.MessageChat msgCreateOK = new ChatLib.MessageChat(MessageType.ChatRoomCreate, msg.SenderName, chatRoomName, "true"); semaphor.WaitOne(); if (chatRoomList.Exists(x => x.name == chatRoomName)) { if (msgCreateOK != null) { msgCreateOK.ContentMessage = "false"; semaphor.Release(); } } else { chatRoomList.Add(new ChatRoom(chatRoomName)); semaphor.Release(); } updateChatRoomList(); ChatLib.ChatLib.SendMessage(newSocket, msgCreateOK); break; case MessageType.ClientPrivateImage: Console.WriteLine("PrivateImage processing"); ConnectedUser targetPrivateImage = connectedUserList.Find(x => x.name == msg.TargetName); Thread.Sleep(100); ChatLib.ChatLib.SendMessage(targetPrivateImage.userSocket, msg); Thread.Sleep(400); ChatLib.ChatLib.SendMessage(newSocket, msg); break; case MessageType.PrivateChatCreate: chatRoomName = msg.TargetName; ChatLib.MessageChat msgPrivateCreateOK = new ChatLib.MessageChat(MessageType.PrivateChatCreate, msg.TargetName, msg.SenderName, "true"); ChatLib.ChatLib.SendMessage(newSocket, msgPrivateCreateOK); ConnectedUser targetPrivateChat = connectedUserList.Find(x => x.name == chatRoomName); Thread.Sleep(100); ChatLib.ChatLib.SendMessage(targetPrivateChat.userSocket,new MessageChat(MessageType.PrivateChatCreate,msg.SenderName,msg.TargetName,"true")); break; case MessageType.PrivateChatExit: chatRoomName = msg.TargetName; ChatLib.MessageChat msgPrivateExitOK = new ChatLib.MessageChat(MessageType.PrivateChatExit, msg.SenderName, chatRoomName, "true"); ChatLib.ChatLib.SendMessage(newSocket, msgPrivateExitOK); break; case MessageType.ClientChatRoomImage: String targetImage = msg.TargetName; foreach (ConnectedUser user in connectedUserList) { if (user.chatRoomList.Exists(x => x.name == targetImage)) { objects = new object[2] { user.userSocket, msg }; socketThread = new Thread(new ParameterizedThreadStart(sendMessage)); socketThread.Start(objects); } } break; } } } else break; } catch (SocketException e) { Console.WriteLine("erreur socket" + e.ToString()); } } } }
// Deserialization d'un message au format JSON public static MessageChat createMessageFromString(string str) { MessageChat msg = JsonConvert.DeserializeObject <MessageChat>(str); return(msg); }