Есть основное приложение 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
А также мы на стороне сервера имеем набор данных (коллекцию)
public List
Для записи в базу данных такой конструкции стоит применять примерно такой метод:
public AddProceduresToDataBase(List
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
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
while (MyDataReader.Read())
{
try
{
jsonData = MyDataReader.GetString(2); // Читаем jsondata из 2го столбца таблицы
Procedure newProcedure = new JavaScriptSerializer().Deserialize
}
ПС. естественно методы нужно дорабатывать, внедрить проверку на наличие уже такого рода данных в БД, расширить функционал чтения для получения новых записей , но это я уже оставляю вам.
ПС. так же тут в принципе показаны примеры сериализации и десиарилизации данных в JSON
Комментариев нет:
Отправить комментарий