public void SetupConn() // Verbindung aufbauen { netStream = client.GetStream(); if (!registrationMode) //Wenn der Client sich nicht registrieren möchte { Login(email, password); GeneralPackage package = (GeneralPackage)bFormatter.Deserialize(netStream); switch (package.Header) { case ComHeader.hLoginOk: contactList.listContacts = ((ContactList)package.Content).listContacts; //TODO: Nach dem Ausdruck "typeof" recherchieren OnLoginOK(); //Publisher aufrufen pollingThread = new Thread(WhoIsOnline); pollingThread.Start(); Receiver(); break; case ComHeader.hWrongPass: OnLoginNotOk(); client.Close(); //Socket "schließen" break; case ComHeader.hDoesntExist: OnLoginNotOk(); client.Close(); //Socket "schließen" break; } } else { Register(email, password); //Auf eine Antwort warten GeneralPackage package = (GeneralPackage)bFormatter.Deserialize(netStream); switch (package.Header) { // Wenn die Registrierung erfolgreich war case ComHeader.hRegistrationOk: OnRegistrationOK(); CloseConn(); Receiver(); /* TODO: Wie läuft das zeitlich ab ? Was passiert, wenn der Client eine Anfrage sendet, um die Verbindung zu beenden und bevor er * dem Server lauschen kann, der Server bereits ein Paket gesendet hat, um die Verbindung zu schließen ? */ break; // Wenn die Registrierung nicht erfolgreich war case ComHeader.hRegistrationNotOk: OnRegistrationWrong(); CloseConn(); //client.Client.Disconnect(true); break; } } }
public void CreateUser(string email, string password, string fsname) { // Wenn die Email noch nicht existiert, kann der Benutzer erstellt werden if (dbController.CheckUserAndCreate(email, password, fsname)) { // Benutzer in die Liste "ConnectedUsers" hinzufügen. Mithilfe dieser Liste wird der jeweilige Socket des Clients angesprochen. User user = new User(); user.Email = email; UserController.ConnectedUsers.Add(user); // Benutzer konnte erfolgreich erstellt werden // Rückmeldung, dass die Registrierung erfolgreich war Console.WriteLine("[{0}] Die Registrierung war erfolgreich", DateTime.Now); GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hRegistrationOk; SendPackage(package); Receiver(); //Dem Client in einer Dauerschleife zuhören } else { //Email adresse existiert bereits Console.WriteLine("[{0}] Die E-Mail Adresse existiert bereits.", DateTime.Now); GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hRegistrationNotOk; SendPackage(package); } }
public void CloseConn() // Verbindung beenden { GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hDisconnect; SendPackage(package); }
void SendPackage(GeneralPackage p) { lock (_object) { bFormatter.Serialize(netStream, p); } }
/// <summary> /// Fragt wiederholend in einem bestimmten Zeitintervall wer online ist /// </summary> public void WhoIsOnline() { while (client.Connected) { GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hState; SendPackage(package); Thread.Sleep(1500); } }
public void MessagesRead(string friend_email) { GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hMessagesRead; ChatPerson chatPerson = new ChatPerson(); chatPerson.Email = friend_email; package.Content = chatPerson; SendPackage(package); }
/// <summary> /// Ein Kontakt in die Kontaktliste hinzufügen /// </summary> /// <param name="friend_email"></param> public void AddContact(string friend_email) { GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hAddContact; ChatPerson friend = new ChatPerson(); friend.Email = friend_email; package.Content = friend; SendPackage(package); }
/// <summary> /// Sendet eine Nachricht an einen anderen Client /// </summary> /// <param name="to">Empfänger</param> /// <param name="msg">Nachricht</param> public void SendMessage(string to, string msg) { GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hSend; MessageSend message = new MessageSend(); message.To = to; message.Msg = msg; package.Content = message; SendPackage(package); }
/// <summary> /// Wartet auf Einkommende Pakete /// </summary> void Receiver() { while (client.Connected) { GeneralPackage package = (GeneralPackage)bFormatter.Deserialize(netStream); switch (package.Header) { case ComHeader.hReceived: // Eine Nachricht von einem anderen Client MessageReceived messageReceived = (MessageReceived)package.Content; OnMessageReceived(new CReceivedEventArgs(messageReceived.From, messageReceived.Message, DateTime.Now.ToString())); //Event auslösen break; case ComHeader.hChat: //Chat Inhalt DataTable dtChat = (((ChatContent)package.Content).chatContent); OnChatReceived(new CChatContentEventArgs(dtChat)); // DataTable als Parameter übergeben. Siehe Klasse "CEvents" break; case ComHeader.hDisconnect: if (pollingThread != null) { pollingThread.Abort(); } tcpThread.Abort(); //In diesem Thread läuft die Methode zum Empfangen von Paketen. client.Close(); break; case ComHeader.hAddContact: //Kontaktliste aktualisieren, wenn ein neuer Kontakt hinzugefügt wurde case ComHeader.hState: // Wenn Aktivitätsstatus der User mitgeteilt wird //Kontaktliste aktualiseren try { contactList.listContacts = ((List <User>)package.Content); OnRefreshContacts(); //Event auslösen } catch (Exception) { } break; case ComHeader.hAddContactWrong: //Wenn der Kontakt nicht hinzugefügt werden kann OnAddContactWrong(); break; } } }
public void Login(string email, string password) { GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hLogin; LoginData loginData = new LoginData(); loginData.Email = email; loginData.Password = password; package.Content = loginData; SendPackage(package); }
public void Login(string email, string password) { GeneralPackage package = new GeneralPackage(); switch (dbController.Login(email, password)) { case 0: // Wenn alle Daten richtig sind //User als angemeldet markieren UserController.ConnectedUsers[UserController.GetIndexOfUser(email)].Status = true; dbController.ChangeStatus(email, true); //Socket des jeweiligen Users speichern UserController.ConnectedUsers[UserController.GetIndexOfUser(email)].Connection = this; individualUser = UserController.ConnectedUsers[UserController.GetIndexOfUser(email)]; //Um zu wissen wer der aktuelle User ist listContacts = dbController.LoadContacts(email); Console.WriteLine("[{0}] Client ({1}) hat sich angemeldet.", DateTime.Now, individualUser.Email); package.Header = ComHeader.hLoginOk; ContactList contactList = new ContactList(); List <User> tmp = dbController.LoadContacts(email); contactList.listContacts = dbController.LoadContacts(email); //Die Kontakte des eingeloggten Users laden package.Content = contactList; SendPackage(package); Receiver(); // Dem Client in einer Dauerschleife zuhören break; case 1: //Benutzer existiert nicht package.Header = ComHeader.hDoesntExist; SendPackage(package); break; case 2: //Passwort ist falsch package.Header = ComHeader.hWrongPass; SendPackage(package); break; } }
/// <summary> /// Zum registrieren /// </summary> /// <param name="email">Email Adresse des Users</param> /// <param name="password">Paswort des Users</param> TODO: Passwort verschlüsseln public void Register(string email, string password) { GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hRegister; LoginData loginData = new LoginData(); loginData.Email = email; loginData.Password = password; loginData.FsName = FsName; package.Content = loginData; SendPackage(package); }
public void CloseConn() { if (individualUser != null) { // Benutzer als abgemeldet markieren UserController.ConnectedUsers[UserController.GetIndexOfUser(individualUser.Email)].Status = false; dbController.ChangeStatus(individualUser.Email, false); } GeneralPackage package = new GeneralPackage(); package.Header = ComHeader.hDisconnect; SendPackage(package); // Verbindung schließen //tcpThread.Abort(); client.Close(); }
public void SetupConn() { try { Console.WriteLine("[{0}] Neue Verbindung!", DateTime.Now); netStream = client.GetStream(); GeneralPackage package = new GeneralPackage(); package = (GeneralPackage)bFormatter.Deserialize(netStream); LoginData loginData = ((LoginData)package.Content); string email = loginData.Email; string password = loginData.Password; string fsName = loginData.FsName; switch (package.Header) { // Wenn der Client sich registrieren möchte case ComHeader.hRegister: Console.WriteLine("[{0}] Ein Client möchte sich registrieren...", DateTime.Now); CreateUser(email, password, fsName); //Receiver(); // Dem Client in einer Dauerschleife zuhören. break; case ComHeader.hLogin: Login(email, password); break; } } catch (Exception e) { //Falls während eines Vorgangs ein Fehler auftreten sollte, wird von einer Verbindungsunterbrechung ausgegangen. //Console.WriteLine("[{0}] Client ({1}) hat sich abgemeldet", DateTime.Now, individualUser.Email); Console.WriteLine("[{0}] Client ({1}) hat sich abgemeldet", DateTime.Now, "ABC"); Console.WriteLine("{0}", e.ToString()); } }
/// <summary> /// Wartet fortlaufend auf Packete vom Client /// </summary> public void Receiver() { try { while (client.Client.Connected) { GeneralPackage receivedPackage = (GeneralPackage)bFormatter.Deserialize(netStream); GeneralPackage sendPackage = new GeneralPackage(); switch (receivedPackage.Header) { case ComHeader.hSend: MessageSend message = new MessageSend(); message = (MessageSend)receivedPackage.Content; int indexReceiver = UserController.GetIndexOfUser(message.To); //Ist der Empfänger Online ? if (UserController.ConnectedUsers[indexReceiver].Status == true) { NetworkStream netStreamOfReceiver = ((SClient)UserController.ConnectedUsers[indexReceiver].Connection).netStream; // An den Empfänger senden sendPackage.Header = ComHeader.hReceived; //Sende Nachricht zum Empfänger MessageReceived messageReceived = new MessageReceived(); messageReceived.From = individualUser.Email; messageReceived.Message = message.Msg; sendPackage.Content = messageReceived; bFormatter.Serialize(netStreamOfReceiver, sendPackage); //Speichere Nachricht in der Datenbank dbController.SaveMessage(individualUser.Email, message.To, message.Msg, false); } else { //Speichere die Nachricht in der Datenbank dbController.SaveMessage(individualUser.Email, message.To, message.Msg, false); } break; case ComHeader.hDisconnect: if (individualUser != null) //individualUser ist null, wenn der Benutzer sich nur registrieren möchte { Console.WriteLine("[{0}] Client ({1}) hat sich abgemeldet", DateTime.Now, individualUser.Email); CloseConn(); } else { Console.WriteLine("[{0}] Client hat sich abgemeldet", DateTime.Now); CloseConn(); } break; case ComHeader.hChat: // Wenn nach dem Inhalt eines "Chats" gefragt wird sendPackage.Header = ComHeader.hChat; ChatPerson chatPerson = ((ChatPerson)receivedPackage.Content); //Die ungelesenen Nachrichten als gelesen markieren dbController.MarkNotReceivedMessagesAsReceived(individualUser.Email, chatPerson.Email); ChatContent chatContent = new ChatContent(); chatContent.chatContent = dbController.LoadChat(individualUser.Email, chatPerson.Email); sendPackage.Content = chatContent; SendPackage(sendPackage); break; case ComHeader.hAddContact: #region Kontakt hinzufügen ChatPerson friend = ((ChatPerson)receivedPackage.Content); // Wenn der Kontakt hinzugefügt wurden konnte if (dbController.AddContact(individualUser.Email, friend.Email)) { sendPackage.Header = ComHeader.hAddContact; sendPackage.Content = dbController.LoadContacts(individualUser.Email); SendPackage(sendPackage); } else { // Wenn der Kontakt nicht hinzugeüft werden kann sendPackage.Header = ComHeader.hAddContactWrong; SendPackage(sendPackage); } #endregion break; case ComHeader.hState: sendPackage.Header = ComHeader.hState; sendPackage.Content = dbController.LoadContacts(individualUser.Email); SendPackage(sendPackage); break; case ComHeader.hMessagesRead: ChatPerson chat_friend = ((ChatPerson)receivedPackage.Content); //Die Nachrichten als gelesen markieren dbController.MarkNotReceivedMessagesAsReceived(individualUser.Email, chat_friend.Email); break; } } } catch (IOException e) { //Falls während eines Vorgangs ein Fehler auftreten sollte, wird von einer Verbindungsunterbrechung ausgegangen. Console.WriteLine("[{0}] Client ({1}) hat sich abgemeldet", DateTime.Now, individualUser.Email); Console.WriteLine("{0}", e.ToString()); //TODO: /* * Wenn ein "Client" sicht abmeldet, erscheint eine Fehlermeldung("[...] connection was forcibly closed"). * Besser wäre eine Abmeldung mit einer Benachrichtigung an den Server */ } }