10 самых распространенных вопросов по работе с Synapse.

10 самых распространенных вопросов по работе с Synapse. Сертификаты

Вопрос 6: отправляю post-запрос на сервер и не получаю ответа, либо возвращается код 4хх. что я делаю не так?

Ответ: самая распространенная ошибка при отправке POST – неправильно заполненный заголовок Content-Type. По умолчанию этот заголовок имеет значение text/html. Для смены значения заголовка необходимо воспользоваться свойством MimeType: string, например так:

Azure analytics: ясность в мгновение ока

10 самых распространенных вопросов по работе с Synapse.

Если чему 2020-й и научил нас, так это тому, что мир может измениться в одно мгновение. На протяжении нескольких месяцев мы наблюдали за тем, как в работе каждой индустрии в мире появляются сбои. Заводы застыли, отели пустуют, а транспортные артерии, соединяющие всех нас, умолкли. В эти беспрецедентные времена компаниям и организациям приходится работать в условиях внезапных изменений, а это требует от них выхода на новый уровень гибкости.

Для того чтобы достичь этой гибкости, нужно непрерывно получать актуальную аналитику на основе постоянно меняющихся данных. Мы твердо нацелены на то, чтобы дать нашим пользователям возможность получать аналитику через Azure безопасно и эффективно. Когда мы представили Azure Synapse Analytics в прошлом ноябре, то фактически устранили барьеры между хранением корпоративных данных и аналитикой больших данных. Это позволило профессионалам в области данных сотрудничать друг с другом, а также создавать собственные решения для аналитики и с легкостью ими управлять. Azure Synapse Analytics – веха в индустрии, и мы с большой радостью наблюдали за высоким интересом клиентов к сервису с момента его дебюта в минувшем ноябре.

Но мы на этом не остановились. Подробности под катом.

Еще один давний барьер отделяет операционные данные от аналитических систем. Поддерживать нагрузку по гибридной транзакционно-аналитической обработке (HTAP) всегда было сложно и затратно, к тому же это заставляло клиентов идти на компромиссы в обработке транзакционных и аналитических данных. Им приходилось либо чрезмерно наращивать дорогостоящие ресурсы, в частности, память, чтобы поддерживать и аналитику, и транзакции в составе единой системы, либо поддерживать раздельные системы. Большинство клиентов выбирали последнее, из-за чего им приходилось иметь дело со сложными ETL-процессами для установления связей между аналитической и операционной системами, из-за чего происходила задержка в получении аналитических выводов из данных.

Еще не было простого, доступного и облачного решения HTAP, позволяющего немедленно, в моменте, получать ценные данные об актуальной ситуации. До сих пор.

Сегодня мы с радостью анонсируем общедоступную предварительную версию Azure Synapse Link, облачного решения для HTAP. Этот инструмент устраняет барьеры между операционной базой данных Azure и Azure Synapse Analytics. Azure Synapse Link позволяет клиентам в один клик получать транзакционные данные в реальном времени из своих операционных баз, без необходимости перемещать информацию или нагружать этим свои системы обработки операционных данных. Azure Synapse Link уже доступна в Azure Cosmos DB, а в будущем появится в других наших сервисах по работе с операционными базами данных, таких как Azure SQL, Azure Database для PostgreSQL, Azure Database для MySQL и прочих.

Как это работает? Краеугольный камень Azure Synapse Link – наша облачная архитектура. Чтобы задействовать ее, клиенту достаточно просто нажать кнопку в своем любимом сервисе баз данных Azure – так создается прямая связь с данными в Azure Synapse Analytics. После этого операционные данные автоматически становятся доступны в Azure Synapse Analytics в виде оптимизированной структуры колонок, подобной покрывающему индексу. Не требуются сложные ETL-процессы или дополнительные вычислительные мощности – клиенты могут начинать анализировать данные в реальном времени с помощью Azure Synapse Analytics – немедленно и экономически эффективно.

Начните сегодня:

Broadcast

Создаем новые проект Delphi (назовем его UDPChat) и на главную форму помещаем компоненты как показано на рисунке ниже:

Наш будущий чат будет и клиентом и сервером одновременно. При этом надо учесть, что, если отправка сообщений участникам чата будет происходить только по требованию пользователя, то получение сообщений от других участников чата должно обеспечиваться непрерывно. То есть серверная часть нашей программы должна работать непрерывно в отдельной нити.

Участник чата может выполнить следующие операции:

  • Войти в чат;
  • Выйти из чата;
  • Сменить свой ник;
  • Отправить сообщение всем участникам, включая и себя самого.

Чтобы наша читающая нить могла различить, какую именно операцию производит участник чата, создадим такой тип данных:

Теперь определимся с форматом сообщений, которые будут посылаться нашей программой. Пусть это будет строка следующего вида:

операция:ник_участника:текст

Получив такую строку, мы сможем однозначно определить, кто из участников произвел действие и, какое это действие.Теперь приступим к разработке нити. Добавляем в секцию uses модуль blcksock и создаем такие типы данных:

Здесь метод DoMessage получает строку, отправленную участником чата, и вызывает событие OnMessage следующим образом:

procedure TUDPReader.DoMessage(const AMessage:string);var Operation: TMessageType;
    UserName:string;
    S:String;begin//operation:nick:message
  S:=AMessage;
  Operation:=TMessageType(StrToIntDef(Copy(AMessage,1,1),0));Delete(S,1,2);
  UserName:=copy(S,1,pos(':',S)-1);Delete(S,1,Length(UserName) 1);ifAssigned(FOnMessage)then
    FOnMessage(Self,Operation,FSocket.GetRemoteSinIP,UserName,S);end;

Метод Execute потока выглядит следующим образом:

То есть, как и говорилось выше, наша нить ничего не отправляет, только получает данные и генерирует события OnMessage или, если возникла ошибка, то OnError.Теперь напишем код основной программы. Начнем с процедуры отправки нового сообщения участникам чата. Задаем следующие константы:

Про сертификаты:  Как установить сертификат в реестр через КриптоПРО | Настройка серверов windows и linux

В этой процедуре мы реализовали сразу два метода передачи данных – unicast

и broadcast

Для чего нам в чате unicast? Во-первых, если нам потребуется добавить в программу возможность приватных бесед (один-на-один), то unicast тут подойдет самым наилучшим образом. Во-вторых, когда в Сети появляется новый участник чата, то:

  1. новичок должен сообщить всем о своем присутствии
  2. все участники должны сообщить только новичку о том, что они есть в Сети.

Опять же, как видите, может пригодиться unicast.

Теперь приступим к обработчикам событий потока. Обработчик ошибок самый простой – выводит в лог сообщение об ошибке:

Обработчик новых сообщений, в зависимости от типа операции, должен выполнять различные действия:

Теперь нам осталось только правильно запустить нить, написать обработчики события OnClick двух кнопок и послать сообщения о входе и выходе из чата.Запуск потока будем осуществлять в момент создания формы приложения:

Сообщать о своем присутствии будем в момент активации формы:

Сообщаем все о смене ника (обработчик OnClick кнопки «Ok»):

Отправляем сообщение в чат (обработчик OnClick кнопки «Отправить»):

И в конце, перед закрытием программы, останавливаем нить и говорим всем, что уходим:

Теперь можно протестировать работу нашего чата. Так как у нас в потоке включается режим повторного использования адреса, то можете запускать прямо у себя на компьютере несколько копий приложения. Но при этом учитывайте, что поиск пользователя в списке проводится по IP, т.е. список пользователей во всех копиях программы будут выглядеть так:

Теперь можете попробовать отправить сообщение, сменить ник или вообще закрыть одну копию программы и посмотреть, как эти все операции будут выполняться:

Как видите, наш чат работает. Теперь попробуем реализовать этот же чат, но вместо broadcast использовать многоадресную передачу данных (multicast). Результат работы чата при этом практически не изменится.

Multicast

Итак, в случае multicast’а, пакет должен быть отправлен определенному кругу получателей. Чтобы добавить сокет в группу получателей необходимо выполнить метод AddMulticast, чтобы удалиться из группы – DropMulticast.

При работе с Multicast следует учитывать, что технология IP Multicast использует адреса с 224.0.0.0 до 239.255.255.255. То есть для отправки и получения сообщений группы, нам необходимо выполнять Connect на один из адресов этого диапазона.

Теперь приступим к разработке нашего чата. Для этого возьмите предыдущий проект (чат с использованием broadcast) и скопируйте его в любую удобную для вас директорию. Теперь откройте скопированный проект и добавьте на главную форму компонент TCheckBox как показано на рисунке ниже:

Выбор флажка «Принимать сообщения» будет добавлять наш «читающий» сокет (в потоке) в группу на получение multicast-пакетов и сообщать всем участникам чата о нашем присутствии. Для выполнения этих действий добавим в поток TUDPReader два метода как показано ниже:

Метод Execute нити переписываем следующим образом:

Теперь добавим в модуль такую константу, определяющую IP-адрес для Multicast:

И напишем обработчик OnClick флажка «Принимать сообщения» следующим образом:

Осталось переписать метод SendMessage. В случае использования Multicast он будет выглядеть следующим образом:

Теперь можете сравнить проект с использованием Broadcast и только что измененный его вариант, ориентированный на применение Multicast. Вы увидите, что поменялось буквально 10 строк (ну и добавился 1 компонент без которого можно было бы обойтись). Для конечного пользователя работа чата будет точно такой же, как и в предыдущем варианте, но используемые технологии передачи данных – разные.Можете запустить проект и проверить, что все операции работают, как и ранее.

Вопрос 1: как работать с tmemorystream, tstringist и т.д.?

Ответ: почитать документацию Delphi на соответствующие темы. Изучением работы с этими типами данных необходимо заниматься задолго ДО начала работы с Synapse.

Вопрос 8: загружаю данные web-странички в memo а там вместо русских букв кракозябры. synapse глючит?

Ответ: Synapse не глючит, а возвращает то, что попросили. Для того, чтобы текст в Memo стал читабельным необходимо исправить его кодировку. Подробное описание способов работы с кодировками есть здесь.

Вопрос 9: как сделать визуализацию скачивания/закачки больших файлов?

Ответ: для этого необходимо обработать событие соккета OnStatus. Пример реализации скачивания файла с ProgressBar’ом есть здесь. Про другие события можно прочитать здесь.

Второй пример: tcp эхо-сервер

Это пример более сложный по сравнению с предыдущим, т.к. нам придётся разработать сразу две программы – сервер и клиент. Смысл работы примера простой: клиент отправляет на сервер строку, а сервер отправляет обратно клиенту строку, полученную из исходной заменой порядка символов на обратный.

Добавление пользователей

Для добавления нового пользователя

Запуск synapse

Создайте сценарий OpenRC для управления демоном Synapse:

Установите права на запуск:

chmod 0755 /etc/init.d/synapse

Запустите демон Synapse:

/etc/init.d/synapse start

Добавьте Synapse в автозагрузку:

rc-update add synapse

Matrix-сервер настроен и готов к работе! Но это только начало пути. Впереди вас ждет открытие удивительных возможностей вашего персонального сервера Matrix.

Клиент

Клиент у нас будет очень простой. Все, что требуется – это соединиться с сервером, отправить строку на сервер и получить ответ. Создаем новый проект Delphi (назовем его «Client») и размещаем на форме приложения компоненты как показано на рисунке ниже:

Код проекта достаточно простой и представлен ниже:

unit main;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Sys-tem.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, blcksock, Vcl.StdCtrls;
 
resourcestring
  rsConnected ='Подключено';
 
const
  cReadTimeout =10000;
 
type
  Tfmain =class(TForm)
    Label1: TLabel;
    edAddress: TEdit;
    Label2: TLabel;
    edPort: TEdit;
    btnConnect: TButton;
    Label3: TLabel;
    edRequestString: TEdit;
    Label4: TLabel;
    lbResponseStr: TLabel;
    dtnSend: TButton;procedure btnConnectClick(Sender:TObject);procedure dtnSendClick(Sender:TObject);procedure FormClose(Sender:TObject;var Action: TCloseAction);private
    Client: TTCPBlockSocket;public{ Public declarations }end;
 
var
  fmain: Tfmain;
 
implementation
 
{$R *.dfm}
 
procedure Tfmain.btnConnectClick(Sender:TObject);begin
  Client:=TTCPBlockSocket.Create;//создаем объект
  Client.RaiseExcept:=True;//показываем все исключения Winsock
  Client.Connect(edAddress.Text,edPort.Text);//пробуем соединиться с сервером
  ShowMessage(rsConnected);end;
 
procedure Tfmain.dtnSendClick(Sender:TObject);begin
  Client.SendString(edRequestString.Text);//отправляем строку на сервер
  lbResponseStr.Caption:=Client.RecvPacket(cReadTimeout)//пробуем получить ответend;
 
procedure Tfmain.FormClose(Sender:TObject;var Action: TCloseAction);begin
  Client.Free;end;
 
end.

Теперь протестируем работу нашего клиента

Про сертификаты:  Фланцевые адаптеры | Инрусстрейд

Краткий обзор сокетов

Сокеты (sockets) представляют собой низкоуровневый унифицированный интерфейс взаимодействия с телекоммуникационными протоколами.

Исторически, сокеты появились в системе UNIX. Когда же Microsoft приняли решение ввести поддержку сетевых протоколов в Windows, ими была реализована обратная совместимость с уже сложившимися стандартами. Таким образом, существует два вида сокетов: классические сокеты Unix и Windows-сокеты, или просто WinSocks.

По типу взаимодействия с использующим их кодом сокеты делятся на два принципиально разных по способу использования типа: синхронные (ещё их иногда называют блокируемые или блокирующие) и асинхронные (неблокируемые, неблокирующие).

Все операции, производимые с блокирующими сокетами, являются синхронными основному потоку приложения. Это значит, что вызвав некоторую функцию сокета мы будем ожидать результата её работы. Например, отправив серверу некий запрос, мы не сможем продолжить работу до тех пор пока от сервера не придет ответ или пока не возникнет ошибка передачи данных.

В этой особенности кроются как достоинства так и недостатки блокирующих сокетов. С одной стороны, написание кода для блокирующих сокетов относительно несложно, т.к. весь код обработки может быть локализован и линейно структурирован: отправили запрос – получили ответ. С другой стороны, необходимо учитывать временные простои при ожидании ответов и помещать обработку в отдельную нить.

Код для работы с асинхронными сокетами строится совершенно по иному принципу. Например, отправив запрос серверу можно спокойно продолжать выполнять другую работу, в том числе отправку новых запросов. Ответ же от сервера (если он будет) поступает в виде возникновения сообщений, которые и необходимо обрабатывать.

Такой подход позволяет реализовывать масштабируемые и весьма стабильные системы (за счет возможности распараллеливания обработки запросов), но требует написания значительного объёма дополнительного кода, направленного на синхронизацию состояний и данных.

Независимо от вида, сокеты классифицируются в зависимости от способа передачи данных на потоковые и блочные (datagram, датаграммные).

Потоковые сокеты работают с установкой соединения, обеспечивая надежную идентификацию обоих сторон, и гарантируют целостность и успешность доставки данных. Потоковые сокеты базируются на протоколе TCP.

Блочные сокеты работают без установки соединения и не обеспечивают ни идентификации отправителя, ни контроля факта доставки данных, ни даже соблюдения очередности доставки пакетов (однако если пакет был доставлен получателю, то именно в том виде в котором был отправлен). Преимущество же блочных сокетов в том, что они заметно быстрее потоковых. Блочные сокеты базируются на протоколе UDP.

Выбор того или иного типа сокетов определяется транспортным протоколом на котором работает сервер, а значит клиент не может по своему желанию установить с блочным сервером потоковое соединение или наоборот.

Помимо потоковых и блочных сокетов существуют, так называемые, «сырые»(RAW) сокеты. Они предоставляют возможность полного контроля над формированием IP-пакетов, в том числе полный доступ к содержимому заголовков отправляемых и получаемых пакетов.

Мосты

Для настройки интеграции Matrix с другими серверами сообщений воспользуйтесь статьёй Matrix bridges.

Обновление synapse

Обновите библиотеки Python для пользователя:

su – synapse

pip install –upgrade matrix-synapse[all]

exit

Перезапустите сервер Synapse:

/etc/init.d/synapse restart

Отладка работы сокетов в synapse

Закончить изучение реализации сокетов в Synapse стоит с рассмотрения вопроса об отладке работы классов, реализующих сокеты. Для этой цели в Synapse имеется специальный модуль– synadbg.pas.

В этом модуле реализован класс:

Используя методы класса Вы можете создавать лог работы сокета, который будет записан в файл с именем «имя_проекта.slog»Для демонстрации работы с классом TSynaDebug попробуем записать лог работы нашего UDP-чата из последнего примера.Итак, подключаем в секцию uses модуль synadbg и добавляем в проект следующие строки:

Теперь запустим чат и отправим одно или несколько сообщений. В результате в папке с проектом появится файл UDPChat.slog, содержащий следующую отладочную информацию:

20211105-020940.418 025704E0HR_ResolvingBegin: 234.5.6.7:24401
20211105-020940.422 025704E0HR_ResolvingEnd: 234.5.6.7:24401
20211105-020940.426 025704E0HR_SocketCreate: IPv4
20211105-020940.429 025704E0HR_Connect: 234.5.6.7:24401
20211105-020940.433 025704E0-> 4:edName:edMessage
20211105-020940.438 025704E0HR_WriteCount: 18
20211105-020940.443 025704E0HR_SocketClose:

Первый пример: сканер портов

Сканер портов – программное обеспечение, созданное для обнаружения хостов сети, в которых открыт нужный порт или набор портов. Сканеры портов, как правило, используются системными администраторами для выявления слабых мест их сетей.

Выбор в качестве первого примера сканера портов сделан не случайно. Во-первых, для реализации этой программы нам потребуется минимум кода. Во-вторых, так как от нас сейчас требуется лишь ознакомиться с работой класса, а не писать сверхмощные навороченные хакерские утилиты, то и сам алгоритм работы программы будет простым и незамысловатым. И, в-третьих, вполне возможно, что предложенный в примере код пригодиться Вам для вполне мирных целей.

Итак, от нашей программы требуется совсем не много – это:

  1. Попытаться подключиться к заданному узлу в cети по заданному порту;
  2. Вернуть результат подключения (успешно/не успешно) и, если потребуется – вывести на экран код ошибки, которая возникла при попытке подключения.

От пользователя для работы программы потребуются следующие данные:

  1. IP-адрес или имя узла в сети, который необходимо проверить
  2. Диапазон портов для проверки;
  3. Значение тайм-аута для подключения, по истечению которого программа будет считать, что попытка подключения была провальной.

Так как мы будем использовать для работы блокирующие сокеты, то для оптимизации вынесем всю работу с ними в отдельную нить.

Теперь приступим к разработке программы. Открываем Delphi, создаем новый проект (назовем его PortScanner) и поместим на главную форму приложения компоненты как показано на рисунке ниже:

Открываем исходный код главного модуля и подключаем в uses модуль blcksock.pas.Вначале создадим класс нити и определим необходимые для его работы типы данных:

В конструктор нити передается IP или имя узла, начало и конец диапазона портов для проверки и тайм-аут подключения. Ниже представлен исходный код всех методов потока:

{ TTCPThread }
 
constructor TTCPThread.Create(ASyspended:boolean; AIP:string; AStartPort,
  AEndPort, ATimeout:integer);begininherited Create(ASyspended);
  FSocket:=TTCPBlockSocket.Create;
  FSocket.ConnectionTimeout:=ATimeout;
  FIP:=AIP;
  FStartPort:=AStartPort;
  FEndPort:=AEndPort;end;
 
destructor TTCPThread.Destroy;begin
  FSocket.Free;//освобождаем памятьinherited;end;
 
procedure TTCPThread.DoConnect(const IP:string; Port:word);beginifAssigned(FOnConnect)then
    FOnConnect(self,IP,Port);end;
 
procedure TTCPThread.DoError(const IP:string; Port:word);beginifAssigned(FOnError)then
    FOnError(Self,IP,Port,FSocket.LastError, FSocket.LastErrorDesc);end;
 
procedure TTCPThread.Execute;var i:integer;begin
  i:=FStartPort;while(i<=FEndPort)and(not Terminated)dobegin
       FSocket.Connect(FIP,IntToStr(I));//пробуем соединиться
       FSocket.GetSins;if FSocket.LastError=0then//ошибок нет - соединились успешно
          DoConnect(FSocket.GetRemoteSinIP, I)else
         DoError(FSocket.GetRemoteSinIP, I);//возвращаем ошибку
      FSocket.CloseSocket;//закрывем сокетinc(i);end;ifnot Terminated then
    FreeOnTerminate:=True;end;

Здесь стоит обратить внимание на следующие моменты работы:

  1. Для событий мы используем IP-адрес, полученный от сокета (FSock-et.GetRemoteSinIP), а не значение, которое передает в поток пользователь (пользователь может указать и имя узла, вместо IP-адреса).
  2. После каждой попытки подключения мы обязательно должны за-крыть сокет, выполнив метод FSocket.CloseSocket. Если этого не делать, начиная со второй попытки подключения, мы будем получать ошиб-ку 10037 «Operation already in progress».
Про сертификаты:  Сертификаты АСБ2Л-10 1х0,03

Теперь напишем код основной программы:

unit main;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Sys-tem.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, blcksock, Vcl.StdCtrls;
 
resourcestring
  rsScan ='Сканировать';
  rsStopScan ='Остановить';
 
type
  TMainForm =class(TForm)
    grpOptions: TGroupBox;
    Label4: TLabel;
    edConnectTimeout: TEdit;
    Label5: TLabel;
    chkWriteError: TCheckBox;
    edPortEnd: TEdit;
    Label3: TLabel;
    edPortStart: TEdit;
    Label2: TLabel;
    edIPAddress: TEdit;
    Label1: TLabel;
    grpLog: TGroupBox;
    memLog: TMemo;
    btnStart: TButton;procedure btnStartClick(Sender:TObject);procedure FormClose(Sender:TObject;var Action: TCloseAction);private//объект потока
     TCPThread: TTCPThread;//обработчик события нити OnConnectprocedure OnConnect(Sender:TObject;const IP:string; Port:word);//Обработчик события нити OnErrorprocedure OnError(Sender:TObject;const IP:string; Port:word; Error-Code:integer; ErrorDesc:string);//Вспомогательный метод для "включения/отключения" элементов управления в группе "Настройки"procedure EnableControls(AEnable:boolean);//Обработчик события завершения работы потокаprocedure OnTerminate(Sender:TObject);public{ Public declarations }end;
 
var
  MainForm: TMainForm;
 
implementation
 
{$R *.dfm}
 
procedure TMainForm.btnStartClick(Sender:TObject);begin//изменяем состояние элементов управления в группе "Настройки"
   EnableControls(btnStart.Caption<>rsScan);if btnStart.Caption=rsScan thenbegin
       TCPThread:=TTCPThread.Create(True,//"спящий поток"
                            edIPAddress.Text,//адресStrToInt(edPortStart.Text),//начало диапазона сканирования портовStrToInt(edPortEnd.Text),//конец диапазона сканирования портовStrToInt(edConnectTimeout.Text));//таймаут ожидания соединения//определяем обработчики событий нити
       TCPThread.OnConnect:=OnConnect;
       TCPThread.OnError:=OnError;
       TCPThread.OnTerminate:=OnTerminate;//запускаем нить
       TCPThread.Start;
       btnStart.Caption:=rsStopScan;endelsebegin//останавливаем нить и освобождаем память
       TCPThread.Terminate;
       TCPThread.WaitFor;
       TCPThread.Free;end;end;
 
procedure TMainForm.EnableControls(AEnable:boolean);var i:integer;beginfor i:=0to grpOptions.ControlCount-1doif grpOptions.Controls[i].ClassType<>TButton then
       TWinControl(grpOptions.Controls[i]).Enabled:=AEnable;end;
 
procedure TMainForm.FormClose(Sender:TObject;var Action: TCloseAction);beginifAssigned(TCPThread)and(not TCPThread.Finished)thenbegin
      TCPThread.Terminate;
      TCPThread.WaitFor;
      TCPThread.Free;end;end;
 
procedure TMainForm.OnConnect(Sender:TObject;const IP:string; Port:word);const cSuccessStr ='[%s] [%s] Порт %d открыт';begin//выводим сообщение в лог
  memLog.Lines.Add(Format(cSuccessStr,[TimeToStr(Now),IP, Port]));end;
 
procedure TMainForm.OnError(Sender:TObject;const IP:string; Port:word;
  ErrorCode:integer; ErrorDesc:string);const cErrorStr ='[%s] [%s] Порт %d закрыт. Ошибка %d (%s)';beginif chkWriteError.Checkedthen
    mem-Log.Lines.Add(Format(cErrorStr,[TimeToStr(Now),IP,Port,ErrorCode,ErrorDesc]))end;
 
procedure TMainForm.OnTerminate(Sender:TObject);begin
  btnStart.Caption:=rsScan;
  EnableControls(True);end;
 
end.

Смысл работы этого кода следующий: после того как пользователь задал необходимые настройки и нажал на кнопку «Сканировать», то создается новый экземпляр нити TTCPThread, все элементы управления в группе «Настройки» отключаются, а надпись кнопки меняется на «Остановить».

Нить после каждой попытки подключения вызывает либо событие OnCon-nect (если подключение успешно), либо OnError (если произошла ошибка подключения). Обработчики событий в главной программе выводят в лог соответствующие сообщения.Так выглядит интерфейс программы, когда нить запущена, а флажок «Выводить в лог ошибки» выбран:

Работа с gmail в synapse.

При работе с GMail следует учитывать, что в этом случае используется шифрованное подключение TLS.  В своих статьях я обычно использовал вспомогательную функцию из модуля smtpsend – SendToRaw.  И здесь опять же для меня непонятная загадка.

После этого при отправке писем указываем 587 порт и письма отправляются как надо. Проверял на Windows XP и Windows 7.

Реализация сокетов в synapse

Все необходимые объекты и типы данных для работы с сокетами располагаются в модуле blcksock.pas.

Рассмотрим классы, реализующие различные типы сокетов в Synapse.

Сервер

Открываем Delphi, создаем новый проект с названием «Server» и размещаем на главной форме компоненты как показано на рисунке ниже:

Вначале напишем класс потока, который будет «слушать» клиентов. Он будет следующим:

Здесь стоит обратить внимание на метод TURLClient.Execute

Тестирование работы

1. Запускаем сервер («Server.exe») и жмем кнопку «Запустить».

2. Запускаем клиент («Client.exe») и заносим в поля «IP-адрес» и «Порт» адрес и номер порта сервера.

3. Жмем в клиенте кнопку «Подключить».

4. В логе сервера должна появиться запись о новом подключении:

5. Отправляем на сервер любую строку:

Как видно на последнем рисунке, наше приложение вполне справилось с поставленной целью, а мы научились создавать сервер TCP с использованием библиотеки Synapse.

Установка и настройка synapse

Создайте системного пользователя

Оцените статью
Мой сертификат
Добавить комментарий