static string address = "192.168.100.8"; // адрес сервера static void Main(string[] args) { IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port); Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { // связываем сокет с локальной точкой, по которой будем принимать данные listenSocket.Bind(ipPoint); // начинаем прослушивание listenSocket.Listen(10); Console.WriteLine("Сервер запущен. Ожидание подключений..."); while (true) { //подключаем нового пользователя Socket handler = listenSocket.Accept(); try { StringBuilder builder = new StringBuilder(); int bytes = 0; // количество полученных байт int bytes_total = 0; // количество ожидаемых в сумме байт int bytes_received = 0; // количество полученных в сумме байт byte[] data = new byte[2048]; // буфер для получаемых данных handler.ReceiveTimeout = 2000; //Create a new RSACryptoServiceProvider object. RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048); //Export the key information to an RSAParameters object. //Pass false to export the public key information or pass //true to export public and private key information. RSAParameters RSAParams = RSA.ExportParameters(false); string rsaKey = JsonConvert.SerializeObject(RSAParams); //отправляем публичный ключ RSA data = Encoding.Unicode.GetBytes(rsaKey); handler.Send(data); //получаем ключ симметричного шифрования, зашифрованный RSA byte[] encrypted_key = new byte[256]; bytes = handler.Receive(encrypted_key); //дешифруем ключ симметричного шифрования приватным ключом RSA //byte[] encrypted_key = RSAEncrypt(key_simm, RSA.ExportParameters(false)); byte[] decrypted_key = RSADecrypt(encrypted_key, RSA.ExportParameters(true)); //удаляем из памяти экземпляр класса асиметричного шифрования RSA.Dispose(); //подтверждаем готовность data = Encoding.Unicode.GetBytes("ready"); handler.Send(data); //получаем инициализующий вектор шифрования byte[] iv = new byte[16]; bytes = handler.Receive(iv); //подтверждаем готовность data = Encoding.Unicode.GetBytes("ready"); handler.Send(data); //получаем длину сообщения data = new byte[2048]; bytes = handler.Receive(data); string[] res = Encoding.Unicode.GetString(data, 0, bytes).Split(' '); if (res.Length != 2 || !res[0].Equals("отправка")) { throw new Exception("Получены некорректные данные"); } bytes_total = int.Parse(res[1]); //подтверждаем готовность data = Encoding.Unicode.GetBytes("ready"); handler.Send(data); // получаем сообщение data = new byte[2048]; do { bytes = handler.Receive(data); bytes_received += bytes; builder.Append(Encoding.Unicode.GetString(data, 0, bytes)); }while (bytes_received < bytes_total); // отправляем количество полученных байт string message = "доставлено " + bytes_received; data = Encoding.Unicode.GetBytes(message); handler.Send(data); // закрываем сокет handler.Shutdown(SocketShutdown.Both); handler.Close(); //дешифруем //string encrypted = Encrypt(str_data, cipher.Key, cipher.IV); string decrypted = Decrypt(builder.ToString(), decrypted_key, iv); //Код работы с JSON взят с //https://котодомик.рф/2015/02/18/json_csharp/ //но лучше найти офф. документацию List <FullRow> rows = JsonConvert.DeserializeObject <List <FullRow> >(decrypted); Console.WriteLine("Конвертация строк"); List <CrossTableFullRow> tableRows = new List <CrossTableFullRow>(); foreach (FullRow row in rows) { tableRows.Add(new ParserRow(row).GetCrossTableFullRow()); } ParserTable tables = new ParserTable(tableRows); Console.WriteLine("Запись данных в БД PostgreSQL"); WritePostgreSQL(tables); } finally { try { // закрываем сокет еще раз, вдруг он еще открыт handler.Shutdown(SocketShutdown.Both); handler.Close(); } catch { } } } } catch (Exception ex) { Console.WriteLine("Произошла ошибка {0}. Приложение будет закрыто.", ex.Message); Console.WriteLine("Нажмите любую клавишу для подтверждения..."); Console.ReadKey(true); Environment.Exit(0); } //Console.WriteLine(); //Console.WriteLine("Нажмите любую клавишу для подтверждения..."); //Console.ReadKey(true); //Environment.Exit(0); }
static public void WritePostgreSQL(ParserTable tables) { //Удаление предыдущей базы данных (проще, чем чистить все данные) string connectionStringDefault = "Server=127.0.0.1;Port=5432;User Id=postgres;Password=masterkey;Database=postgres;"; string queryCreateDB = @"CREATE DATABASE outputdatabase WITH OWNER = postgres ENCODING = 'UTF8' LC_COLLATE = 'Russian_Russia.1251' LC_CTYPE = 'Russian_Russia.1251' TABLESPACE = pg_default CONNECTION LIMIT = -1;"; int sucsess = 0; while (sucsess != 1) { Console.WriteLine("Подключение к базе PostgreSQL..."); using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringDefault)) using (NpgsqlCommand command = new NpgsqlCommand("DROP DATABASE outputdatabase;", connection)) { try { connection.Open(); command.ExecuteNonQuery(); Console.WriteLine("Старые данные в базе PostgreSQL стерты"); connection.Close(); sucsess = 1; } catch (Exception ex) { connection.Close(); if (ex.Data["SqlState"].Equals("55006")) { sucsess--; if (sucsess > -3) { Console.WriteLine("Пожалуйста, закройте базу данных и нажмите любую клавишу для подтверждения..."); Console.ReadKey(true); } else { Console.WriteLine("База данных открыта в данный момент. Приложение будет закрыто."); Console.WriteLine("Нажмите любую клавишу для подтверждения..."); Console.ReadKey(true); Environment.Exit(0); } } else if (ex.Data["SqlState"].Equals("3D000")) { //ничего, такой базы данных не существует. Этого я и добивалась sucsess = 1; } else if (ex.Data["SqlState"].Equals("28P01")) { Console.WriteLine("Неправильно указан логин или пароль. Приложение будет закрыто."); Console.WriteLine("Нажмите любую клавишу для подтверждения..."); Console.ReadKey(true); Environment.Exit(0); } else { Console.WriteLine("Произошла ошибка {0}. Приложение будет закрыто.", ex.Message); Console.WriteLine("Нажмите любую клавишу для подтверждения..."); Console.ReadKey(true); Environment.Exit(0); } } } } //Создание БД заново try { using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringDefault)) using (NpgsqlCommand command = new NpgsqlCommand(queryCreateDB, connection)) { connection.Open(); command.ExecuteNonQuery(); connection.Close(); Console.WriteLine("Создана новая БД PostgreSQL"); } } catch (Exception ex) { Console.WriteLine("Ошибка при создании БД PostgreSQL " + ex.Message); Console.WriteLine("Приложение будет закрыто."); Console.WriteLine("Нажмите любую клавишу для подтверждения..."); Console.ReadKey(true); Environment.Exit(0); } //Наполнение БД string connectionString = "Server=127.0.0.1;Port=5432;User Id=postgres;Password=masterkey;Database=outputdatabase;"; try { using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) { connection.Open(); //Создание таблиц using (NpgsqlCommand command = new NpgsqlCommand(TableModelRow.GetCreateQuery(), connection)) { try { command.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine("Ошибка при создании таблицы Model \n" + ex.Message); } } using (NpgsqlCommand command = new NpgsqlCommand(TableAirplaneRow.GetCreateQuery(), connection)) { try { command.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine("Ошибка при создании таблицы Airplane \n" + ex.Message); } } using (NpgsqlCommand command = new NpgsqlCommand(TableAirportRow.GetCreateQuery(), connection)) { try { command.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine("Ошибка при создании таблицы Airport \n" + ex.Message); } } using (NpgsqlCommand command = new NpgsqlCommand(TableSeatRow.GetCreateQuery(), connection)) { try { command.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine("Ошибка при создании таблицы Seat \n" + ex.Message); } } using (NpgsqlCommand command = new NpgsqlCommand(TableFlightRow.GetCreateQuery(), connection)) { try { command.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine("Ошибка при создании таблицы Flight \n" + ex.Message); } } using (NpgsqlCommand command = new NpgsqlCommand(TablePassengerRow.GetCreateQuery(), connection)) { try { command.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine("Ошибка при создании таблицы Passenger \n" + ex.Message); } } Console.WriteLine("Таблицы БД PostgreSQL успешно созданы"); //Заполнение БД данными List <TableModelRow> tableModel = tables.tableModel; List <TableAirplaneRow> tableAirplane = tables.tableAirplane; List <TableSeatRow> tableSeat = tables.tableSeat; List <TableAirportRow> tableAirport = tables.tableAirport; List <TableFlightRow> tableFlight = tables.tableFlight; List <TablePassengerRow> tablePassenger = tables.tablePassenger; int count = 0; foreach (TableModelRow row in tableModel) { using (NpgsqlCommand command = new NpgsqlCommand(row.GetSQL(), connection)) { try { command.ExecuteNonQuery(); count++; } catch (Exception ex) { Console.WriteLine("Ошибка при вставке в Model " + row.ToString() + "\n" + ex.Message); } } } Console.WriteLine("В таблицу Model добавлено {0} записей", count); count = 0; foreach (TableAirplaneRow row in tableAirplane) { using (NpgsqlCommand command = new NpgsqlCommand(row.GetSQL(), connection)) { try { command.ExecuteNonQuery(); count++; } catch (Exception ex) { Console.WriteLine("Ошибка при вставке в Airplane " + row.ToString() + "\n" + ex.Message); } } } Console.WriteLine("В таблицу Airplane добавлено {0} записей", count); count = 0; foreach (TableSeatRow row in tableSeat) { using (NpgsqlCommand command = new NpgsqlCommand(row.GetSQL(), connection)) { try { command.ExecuteNonQuery(); count++; } catch (Exception ex) { Console.WriteLine("Ошибка при вставке в Seat " + row.ToString() + "\n" + ex.Message); } } } Console.WriteLine("В таблицу Seat добавлено {0} записей", count); count = 0; foreach (TableAirportRow row in tableAirport) { using (NpgsqlCommand command = new NpgsqlCommand(row.GetSQL(), connection)) { try { command.ExecuteNonQuery(); count++; } catch (Exception ex) { Console.WriteLine("Ошибка при вставке в Airport " + row.ToString() + "\n" + ex.Message); } } } Console.WriteLine("В таблицу Airport добавлено {0} записей", count); count = 0; foreach (TableFlightRow row in tableFlight) { using (NpgsqlCommand command = new NpgsqlCommand(row.GetSQL(), connection)) { try { command.ExecuteNonQuery(); count++; } catch (Exception ex) { Console.WriteLine("Ошибка при вставке в Flight " + row.ToString() + "\n" + ex.Message); } } } Console.WriteLine("В таблицу Flight добавлено {0} записей", count); count = 0; foreach (TablePassengerRow row in tablePassenger) { using (NpgsqlCommand command = new NpgsqlCommand(row.GetSQL(), connection)) { try { command.ExecuteNonQuery(); count++; } catch (Exception ex) { Console.WriteLine("Ошибка при вставке в Passenger " + row.ToString() + "\n" + ex.Message); } } } Console.WriteLine("В таблицу Passenger добавлено {0} записей", count); Console.WriteLine("Все данные добавлены\n"); connection.Close(); } } catch (Exception ex) { Console.WriteLine("Ошибка при работе с БД PostgreSQL " + ex.Message); Console.WriteLine("Приложение будет закрыто."); Console.WriteLine("Нажмите любую клавишу для подтверждения..."); Console.ReadKey(true); Environment.Exit(0); } }