Exemple #1
0
        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;
                }
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        public void CloseConn() // Verbindung beenden
        {
            GeneralPackage package = new GeneralPackage();

            package.Header = ComHeader.hDisconnect;
            SendPackage(package);
        }
Exemple #4
0
 void SendPackage(GeneralPackage p)
 {
     lock (_object)
     {
         bFormatter.Serialize(netStream, p);
     }
 }
Exemple #5
0
 /// <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);
     }
 }
Exemple #6
0
        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);
        }
Exemple #7
0
        /// <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);
        }
Exemple #8
0
        /// <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);
        }
Exemple #9
0
        /// <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;
                }
            }
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        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;
            }
        }
Exemple #12
0
        /// <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);
        }
Exemple #13
0
        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();
        }
Exemple #14
0
        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());
            }
        }
Exemple #15
0
        /// <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
                 */
            }
        }