protected internal void Listen()//Прослушивание всех входящих соединений
        {
            try
            {
                tcpListener = new TcpListener(IPAddress.Any, 8888);//Инициализция объекта прослушивания tcp подключений с последующим стартом
                tcpListener.Start();
                FROM.toBody("Сервер запущен. Ожидание подключений...", null, 1);

                while (true)                                                         //Цикл принятия подключений
                {
                    TcpClient tcpClient = tcpListener.AcceptTcpClient();             //Объект подключенного tcp клиента

                    CoreServer.Message ForNameUser;                                  //Объект сообщений

                    NetworkStream Stream    = tcpClient.GetStream();                 //Объект сетевого потока
                    IFormatter    formatter = new BinaryFormatter();                 //Интерфейс/объект для сериализации и десериализации объектов

                    ForNameUser = (CoreServer.Message)formatter.Deserialize(Stream); //Десериализация объекта Message
                    if (ForNameUser.type == "connection")                            //Обработка сообщения с запросом на подключение к серверу
                    {
                        //Создание объекта клиента и запуск потока прослушивания сообщений от клиента
                        ClientObject clientObject = new ClientObject(tcpClient, Stream, this, FROM, ForNameUser.UserName);

                        Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
                        clientThread.Start();
                    }
                }
            }
            catch (Exception ex)
            {
                FROM.toBody(ex.Message, null, 1);//Вывод текста исключения
                Disconnect();
            }
        }
Ejemplo n.º 2
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();
            }
        }