Ejemplo n.º 1
0
        //Чтение входящего сообщения и преобразование в объект Message
        private CoreServer.Message GetMessage()
        {
            CoreServer.Message tempMess;
            BinaryFormatter    formatter = new BinaryFormatter();

            do
            {
                tempMess = (CoreServer.Message)formatter.Deserialize(Stream);
            }while (Stream.DataAvailable);
            tempMess.OnlineUser = ServerObject.GetClients();
            return(tempMess);
        }
Ejemplo n.º 2
0
        static Thread listenThread;                             // поток для прослушивания подключений по tcp

        private void StartSRV_Click(object sender, EventArgs e) //Обработчик нажатия кнопки запуска сервера
        {
            statSRV.Text     = "Запущен.";
            StartSRV.Enabled = false;
            StopSRV.Enabled  = true;

            try
            {
                //Инициализация объекта сервера с дальнейшей инициализацией объекта потока прослушивания tcp подключений
                server = new ServerObject();
                server.form(TO);
                listenThread = new Thread(new ThreadStart(server.Listen));
                listenThread.Start();
            }
            catch (Exception ex)
            {
                //В случае исключения, вывод текста исключения в поле лога сервера
                server.Disconnect();
                toBody(ex.Message, null, 0);
            }
        }
Ejemplo n.º 3
0
        public void Process()     //Метод принятия сообщений и их обработка
        {
            //Отправлка сообщение со списком подключенных пользователей
            CoreServer.Message OnMes     = new CoreServer.Message("online", "", "", "", ServerObject.GetClients());
            IFormatter         formatter = new BinaryFormatter();

            formatter.Serialize(this.Stream, OnMes);

            int flagForSign = 0;    //Флаг обозначения что пользователь вошёл

            try
            {
                string messageString; //Часть строки сообщения для вывода в чат
                string bodyMess = ""; //Часть строки сообщения для вывода в чат

                while (true)
                {
                    CoreServer.Message mess = new CoreServer.Message();//Создание объекта сообщения

                    try
                    {
                        mess      = GetMessage();//Получение сообщения
                        userName  = mess.UserName;
                        this.name = userName;

                        if (mess.type == "mess")//Если тип сообщения "Сообщение"
                        {
                            //Разбор сообщения и вывод его в чат и трансляция всем участникам
                            messageString = String.Format("{0}:{1}:", mess.DateTime, userName);
                            bodyMess      = mess.body;
                            LOG.toBody(messageString, bodyMess, 0);
                            bodyMess = "";
                            logToBase(mess);//Логирование сообщения
                            server.BroadcastMessage(mess, this.Id);
                        }

                        else if (mess.type == "signIn")//Если тип сообщения "Вход"
                        {
                            //Обработка входа пользователя в чат. Поиск его в базе и отправкой соответствующего сообщения
                            logToBase(mess);//Логирование сообщения
                            //Подключение к базе и выполнение нужных действий
                            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + Environment.CurrentDirectory + @"\tcpChat.db; Version=3;"))
                            {
                                conn.Open();
                                SQLiteCommand cmd       = conn.CreateCommand();
                                SQLiteCommand cmdInsert = conn.CreateCommand();


                                cmd.CommandText = "SELECT * FROM users WHERE login='******' AND pass='******'";
                                try
                                {
                                    SQLiteDataReader r = cmd.ExecuteReader();
                                    if (r.HasRows)
                                    {
                                        CoreServer.Message regAns = new CoreServer.Message("signAnYes", mess.UserName, "Добро пожаловать в чат :)!", "", ServerObject.GetClients());

                                        formatter.Serialize(this.Stream, regAns);
                                        r.Close();
                                        flagForSign = 1;
                                    }
                                    else
                                    {
                                        CoreServer.Message regAns = new CoreServer.Message("signAnNo", mess.UserName, "Такой пользователь не найден или неверен пароль!", "", ServerObject.GetClients());

                                        formatter.Serialize(this.Stream, regAns);
                                        Close();
                                    }
                                }
                                catch (SQLiteException ex)
                                {
                                    MessageBox.Show(ex.Message);
                                }
                            }
                            //ТРанслирования сообщения если пользователь успешно вошёл в чат
                            if (flagForSign == 1)
                            {
                                server.BroadcastMessage(mess, this.Id);
                            }
                        }
                        else if (mess.type == "regg")//Если тип сообщения "Регистрация"
                        {
                            //Обработка регистрации пользователя в чате. Поиск его в базе и отправкой соответствующего сообщения

                            logToBase(mess);//Логирование сообщения
                            //Подключение к базе и выполнение нужных действий
                            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + Environment.CurrentDirectory + @"\tcpChat.db; Version=3;"))
                            {
                                conn.Open();
                                SQLiteCommand cmd       = conn.CreateCommand();
                                SQLiteCommand cmdInsert = conn.CreateCommand();


                                cmd.CommandText = "SELECT * FROM users WHERE login='******'";
                                try
                                {
                                    SQLiteDataReader r = cmd.ExecuteReader();
                                    if (r.HasRows)
                                    {
                                        CoreServer.Message regAns = new CoreServer.Message("regansvNo", mess.UserName, "Такой пользователь уже существует!", "", ServerObject.GetClients());
                                        formatter.Serialize(this.Stream, regAns);
                                        r.Close();
                                        Close();
                                    }
                                    else
                                    {
                                        cmdInsert.CommandText = String.Format("INSERT INTO users (login,pass) VALUES('{0}', '{1}');", mess.UserName, mess.body);
                                        cmdInsert.ExecuteNonQuery();
                                        LOG.toBody("Пользователь " + mess.UserName, " успешно зарегестрировался", 1);

                                        CoreServer.Message regAns = new CoreServer.Message("regansvYes", mess.UserName, "Вы успешно зарегистрированы!", "", ServerObject.GetClients());
                                        formatter.Serialize(this.Stream, regAns);
                                    }
                                }
                                catch (SQLiteException ex)
                                {
                                    MessageBox.Show(ex.Message);
                                }
                            }
                        }
                        else if (mess.type == "reqonline") //Если тип сообщения "Запрос онлайна"
                        {
                            //Обработка сообщения запроса онлайн пользователей с последующим ответом
                            CoreServer.Message tempMess;
                            BinaryFormatter    tempFprm = new BinaryFormatter();
                            do
                            {
                                tempMess = (CoreServer.Message)tempFprm.Deserialize(Stream);
                            }while (Stream.DataAvailable);
                            tempMess.OnlineUser = ServerObject.GetClients();
                            OnMes = new CoreServer.Message("online", "", "", "", ServerObject.GetClients());
                            formatter.Serialize(this.Stream, OnMes);
                        }
                    }
                    catch
                    {
                        //Отправка сообщения о том, что пользователь вышел из чата
                        messageString = String.Format("{0}:{1} покинул чат!", DateTime.Now.ToString(), userName);
                        bodyMess      = "";
                        LOG.toBody(messageString, bodyMess, 1);
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                LOG.toBody(e.Message, null, 1);//Вывод исключения в чат
            }
            finally
            {
                //В случае выхода из цикла удаляется пользователь из списк онлайн и трансляция сообщения выхода пользователя
                server.RemoveConnection(this.Id);
                CoreServer.Message exMes = new CoreServer.Message("exit", userName, "Пользователь вышел из чата", DateTime.Now.ToString(), ServerObject.GetClients());
                logToBase(exMes);//Логирование сообщения
                if (flagForSign == 1)
                {
                    server.BroadcastMessage(exMes, this.Id);
                }
                Close();
            }
        }