Страницы

Поиск по вопросам

пятница, 19 октября 2018 г.

C# Удалённая запись в массив другого приложения

Есть основное приложение WinForms в котором ведётся парсинг интернет ресурса с записью необходимых данных в двумерный массив string[5000, 50]
Где 1й столбец строки это ссылка, а остальные столбцы данные с ресурса.
Как только набирается строка c данными , данные этой строки сгруппировано выводятся в окне приложения.
Как мне эти данные передавать в массив другого приложения WinForms по интернету и так же выводить ?
Главный вопрос, как передавать эти данные c записью в массив ?
Самостоятельно искал, читал немного про сокеты, но пока каша в голове и не знаю про подводные камни.
Хотелось бы как то тупо, при заполнении строки массива в главном приложении, сразу эту строку массива передавать в массив удалённого приложения.


Ответ

Я мог бы вам предложить один из вариантов организации данного функционала:
Логика :
1) Серверная часть
Ваш Parser после анализа полученных данных и формирования массива значений (рекомендую использовать коллекции в место статичного массива) сериализуется в json(или XML формат) строку и добавляет их в базу данных MySQL (локальную или удалённую) (с одновременной проверкой наличия там таких данных) - SQL запрос для организации структуры базы данных для ваше случая должна быть примерно таковой
CREATE DATABASE IF NOT exists parsersystem; use parsersystem; CREATE TABLE IF NOT exists Procedures ( number int AUTO_INCREMENT, id int, jsonData TEXT, ts_create timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', ts_update timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (number) );
где number это автоинкриментное поле (уникальный номер записи в БД)
id - уникальный специфичный номер записи (заданный пользователем)
jsonData - сериализация любых данных в том числе и массива ваших значений
ts_create - дата и время создание записи
ts_update - дата и время обновления записи
MySQL сервер настраивается таким образом чтобы к нему имели доступ клиенты через интернет либо локальную сеть (в зависимости от ваших нужд)
2) Клиенты
Клиентское приложение будь то Desktop, Android или другое, не имеет связи непосредственно с вашим серверным Parser приложением, а обращается к открытой MySQL базе (закрытой по желанию паролем), на предмет наличия новых записей, это становится возможным при использовании поля ts_create - которое отражает время создание записи Логика:
клиент периодически делает запрос к базе данных примерно такой
SELECT * FROM Procedures WHERE ts_create > TIMESTAMP (время последней добавленной клиентом записи) ORDER BY ts_create DESC
таким образом клиент получит только новые записи из таблицы на стороне клиента происходит десереализация jsondata и формирование своей локальной копии массива (идентичного тому что на стороне сервера) клиенту следует хранить дату и время последней добавленной записи для последующих запросов
Преимущество такого подхода :
независимость клиентской и серверной части приложения, (данные хранятся отдельно в БД) нет необходимости в организации специфического протокола общения (сервер -клиент) при использовании подхода передачи при помощи сокетов
Предположим что мы имеем некий класс описывающий модель наших данных
public class Procedure(){ public String Name { get; set; } public List Data { get; set; } }
А также мы на стороне сервера имеем набор данных (коллекцию)
public List procedures;
Для записи в базу данных такой конструкции стоит применять примерно такой метод:
public AddProceduresToDataBase(List procedureList) { string Connect = "Port=3306; Database=parsersystem;Data Source=127.0.0.1;Password=mysql_password; MySqlConnection myConnection = null; try { myConnection = new MySqlConnection(Connect);
myConnection.Open(); } catch (Exception e) { myConnection.Close(); Console.Out.WriteLine("Ошибка доступа к базе данных"); }
foreach (var proc in procedureList) { var json = new JavaScriptSerializer().Serialize(proc); // Экранируем спец символы json = json.Replace(Convert.ToChar(0171) + "", "") .Replace(Convert.ToChar(0187) + "", "") .Replace("\\\"", "") .Replace("\\","\\\\"); MySqlCommand myCommand_add = new MySqlCommand(@"INSERT INTO Procedures(id,jsondata,ts_create,ts_update) VALUE (" + сгенерить нужно ID + "+ json + "',null,null);", myConnection); myCommand_add.ExecuteNonQuery(); }
myConnection.Close(); //Обязательно закрываем соединение!
}
Для чтения коллекции из базы данных стоит использовать примерно такой метод
public List GetProcedures() { string Connect = "Port=3306; Database=parsersystem;Data Source=127.0.0.1;Password=mysql_password; MySqlConnection myConnection = null; try { myConnection = new MySqlConnection(Connect);
myConnection.Open(); } catch (Exception e) { myConnection.Close(); Console.Out.WriteLine("Ошибка доступа к базе данных"); }
string CommandText = "SELECT * FROM Procedures "; MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection);
MySqlDataReader MyDataReader; MyDataReader = myCommand.ExecuteReader();
List procedures = new List(); String jsonData;
while (MyDataReader.Read()) { try { jsonData = MyDataReader.GetString(2); // Читаем jsondata из 2го столбца таблицы Procedure newProcedure = new JavaScriptSerializer().Deserialize(jsonData); procedures.Add(newProcedure); } catch { Console.Out.WriteLine("Ошибка разбора JSON данных о процедуре"); } } MyDataReader.Close(); myConnection.Close(); return procedures;
}
ПС. естественно методы нужно дорабатывать, внедрить проверку на наличие уже такого рода данных в БД, расширить функционал чтения для получения новых записей , но это я уже оставляю вам. ПС. так же тут в принципе показаны примеры сериализации и десиарилизации данных в JSON

Комментариев нет:

Отправить комментарий