Как лучше организовать TCP Сервер и Клиент
Модератор: Модераторы
Как лучше организовать TCP Сервер и Клиент
Уважаемые форумчане, у меня очень мало опыта в написании сетевых приложений, по этому хочу спросить - как лучше организовать TCP Сервер и Клиент?
Можно напрямую использовать ф-ии Accept, Send и Resv (конечно нужно использовать и др., но они вопросов не вызывают т.к. основной поток не блокируют. Ф-ции Accept, Send и Resv можно вынести в отдельные потоки (TThread) (там сначала Listen, потом в отдельном потоке уже Accept, когда будет запрос, создаём ещё поток, где уже Send и Resv. Однако читал, что этот метод требует много ресурсов от системы.
Можно организовать по событиям (прерываниям) Select (или WSAEventSelect). Там неск. сложнее, но суть заключается что-бы когда произойдёт событие, система об этом сообщит. И остаётся только обработать событие (вызвать Accept, Send и Resv) т.к. в буфере есть данные, то блокировки не будет. А может ещё кто какой способ предложит.
Поизучал модули Sockets, WinSocet и WinSocet2. Выяснил что модуль Sockets написан под какую-то задачу, более универсальны WinSocet и (более новый) WinSocet2, но они под Windows (а как в др. ОС?)
Модуль Sockets не позволяет некоторые вещи (или я чего-то не знаю).
Касательно моих запросов: у меня не будет подключено к одному северу много клиентов, скорее наоборот один клиент будет опрашивать много серверов. "Общаться" будут меж-собой Контролеры и SCADA по протоколу ModBus. Это не конкретная система, а компонент для написания SCADA.
У кого есть какие мысли по этому поводу???
Можно напрямую использовать ф-ии Accept, Send и Resv (конечно нужно использовать и др., но они вопросов не вызывают т.к. основной поток не блокируют. Ф-ции Accept, Send и Resv можно вынести в отдельные потоки (TThread) (там сначала Listen, потом в отдельном потоке уже Accept, когда будет запрос, создаём ещё поток, где уже Send и Resv. Однако читал, что этот метод требует много ресурсов от системы.
Можно организовать по событиям (прерываниям) Select (или WSAEventSelect). Там неск. сложнее, но суть заключается что-бы когда произойдёт событие, система об этом сообщит. И остаётся только обработать событие (вызвать Accept, Send и Resv) т.к. в буфере есть данные, то блокировки не будет. А может ещё кто какой способ предложит.
Поизучал модули Sockets, WinSocet и WinSocet2. Выяснил что модуль Sockets написан под какую-то задачу, более универсальны WinSocet и (более новый) WinSocet2, но они под Windows (а как в др. ОС?)
Модуль Sockets не позволяет некоторые вещи (или я чего-то не знаю).
Касательно моих запросов: у меня не будет подключено к одному северу много клиентов, скорее наоборот один клиент будет опрашивать много серверов. "Общаться" будут меж-собой Контролеры и SCADA по протоколу ModBus. Это не конкретная система, а компонент для написания SCADA.
У кого есть какие мысли по этому поводу???
Так а почему нельзя использовать готовые наборы библиотек типа fcl-net, indy, synapse? там же по идее клиенту надо будет подцепится к контроллеру, записать в сокет что то типа ':08170000000A20000001020000B4' + #13 + #10, прочитать ответ и отключиться? или соединение будет постоянным?
DYUMON
В принципе Вы правы, почти так всё и выглядит. Правда протокол (модбус и др. тоже) подразумевает что мастер (главный) (у нас клиент) опрашивает слэйвы (у нас серсервера) по очереди. Без запроса они не отвечают. Опуская подробности запрос идет постоянно, в цикле, отключаться не надо. Даже больше, обрыв - это ошибка.
Что касается indy я думал что это http ориентированный. А synapse - устаревший и сейчас не используется. Я думал сокеты-более универсальны. Короче indy не подходит, а synapse - не знаю над поизучать.
В принципе Вы правы, почти так всё и выглядит. Правда протокол (модбус и др. тоже) подразумевает что мастер (главный) (у нас клиент) опрашивает слэйвы (у нас серсервера) по очереди. Без запроса они не отвечают. Опуская подробности запрос идет постоянно, в цикле, отключаться не надо. Даже больше, обрыв - это ошибка.
Что касается indy я думал что это http ориентированный. А synapse - устаревший и сейчас не используется. Я думал сокеты-более универсальны. Короче indy не подходит, а synapse - не знаю над поизучать.
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
vvvch писал(а): А synapse - устаревший и сейчас не используется
Это почему же? Проект не закрыт, легкий и востребованный...ИМХО...
vvvch писал(а):А synapse - устаревший и сейчас не используется. Я думал сокеты-более универсальны.
...аха.
А чем отличается соединение через сокеты от TTCPBlockSocket из synapse?
Я считал, что synapse устарел, но скорее всего я не прав, раз есть несогласные. Я просто этого не знаю. Надо поизучать! И разобраться, я наткнулся на него, но ссылка было старая, вот я и подумал. Ладно займусь...
Но всё-таки вопрос, как быть с системными ресурсами, или это не важно? Кто, что скажет?
Добавлено спустя 12 минут 6 секунд:
Кто знает что такое sunapse объясните, пожалуйста, в двух словах, на пальцах. Мне нужно выяснить то это или нет, подойдёт, не подойдёт.
Но всё-таки вопрос, как быть с системными ресурсами, или это не важно? Кто, что скажет?
Добавлено спустя 12 минут 6 секунд:
Кто знает что такое sunapse объясните, пожалуйста, в двух словах, на пальцах. Мне нужно выяснить то это или нет, подойдёт, не подойдёт.
vvvch писал(а):Но всё-таки вопрос, как быть с системными ресурсами, или это не важно? Кто, что скажет?
Если постоянных соединений будет меньше 1000, то всё получится.
Добавлено спустя 49 минут 9 секунд:
vvvch писал(а):Кто знает что такое sunapse объясните
это как Indy, только легче (в смысле меньше кода), и очень и очень дружелюбен к FPC.
Официальный сайт. Наибольшая популярность, кстати, из России.
скалогрыз писал(а):скалогрыз
Разбираюсь... Пока "накопал" то, что это универсальная библиотека, которая много - чего позволяет. Но из всего этого многообразия мне нужно только простая передача данных (без всяких дополнительных тэгов) Скорее всего TTCPBlockSocket. Плюс к этому всему мне потребуется передача данных по com-портам (я об этом не писал, но надо) Тем более это сделано более единообразно и объектами.
Из минусов - надо устанавливать библиотеку. Она без платная, но всё - таки. Кроме того, я где-то читал, что нужны какие-то dll. Я с этим пока не столкнулся, но я и примеры не компилировал, только посмотрел. (нужно это или нет, скажите кто знает?) Если надо, придётся их копировать в system. Кроме того это не приложение, а компонент и кроме него есть кому кушать ресурсы системы и не хотелось-бы всё упиралось в него. Таких компонентов может быть не один.
Что скажете?
Вот тут http://www.webdelphi.ru/2013/12/kniga-o-synapse-glava-0-sokety/ у человека подробно описана работа с synapse.
DYUMON
Во первых, спасибо за информацию, я как раз искал учебник по библиотеке... Это хорошо.
Но сейчас надо всё-таки решить "связываться" с ней. Из плюсов - единообразие и , я думаю, опыт др. людей что-бы сгладить трудности. Из минусов - использование доп. файлов (их надо скачивать и устанавливать) (библиотеки сокетов и портов есть в системе, их скачивать не надо) и выяснить требовательность к ресурсам.
Я это определить не могу, это надо у кого есть опыт использования.
Во первых, спасибо за информацию, я как раз искал учебник по библиотеке... Это хорошо.
Но сейчас надо всё-таки решить "связываться" с ней. Из плюсов - единообразие и , я думаю, опыт др. людей что-бы сгладить трудности. Из минусов - использование доп. файлов (их надо скачивать и устанавливать) (библиотеки сокетов и портов есть в системе, их скачивать не надо) и выяснить требовательность к ресурсам.
Я это определить не могу, это надо у кого есть опыт использования.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Ничего устанавливать не нужно для использования synapse. Ну то есть можно установить библиотеку synapse как компонент lazarus, но это не обязательно, даже не нужно. Обычные исходники. Просто указываете в блоке uses и добавляете пути к исходникам библиотеки. Как если бы эти исходники были частью Вашего кода.
dll никакие тоже не нужны в Вашем случае
dll никакие тоже не нужны в Вашем случае
единственный раз когда нужны были библиотеки к synapse это когда я использовал для подключения openssl.
Что касается Synapse - разбираюсь. Спасибо за наводку.
DYUMON Synapse сама библиотека, какие ещё библиотеки понадобились? Она вроде SSL поддерживает (но вопрос риторический, так для общего образования)
А не риторический вопрос (так никто и не ответил), какие ресурсы системы (процессорное время, память и др. загрузка оборудования) может потребоваться? Обмен будет идти постоянно, в цикле (прекращение обмена - авария). Кроме того возможен и не один сеанс (они, сеансы будут идти одновременно) когда потребуется опрашивать несколько контроллеров (но их будет, как правило, не больше двух десятков) Впрочем это как организуешь сеть. А основная нагрузка - это графика и получение данных с локального сервера типа MySQL.
DYUMON Synapse сама библиотека, какие ещё библиотеки понадобились? Она вроде SSL поддерживает (но вопрос риторический, так для общего образования)
А не риторический вопрос (так никто и не ответил), какие ресурсы системы (процессорное время, память и др. загрузка оборудования) может потребоваться? Обмен будет идти постоянно, в цикле (прекращение обмена - авария). Кроме того возможен и не один сеанс (они, сеансы будут идти одновременно) когда потребуется опрашивать несколько контроллеров (но их будет, как правило, не больше двух десятков) Впрочем это как организуешь сеть. А основная нагрузка - это графика и получение данных с локального сервера типа MySQL.
vvvch писал(а): какие ресурсы системы (процессорное время, память и др. загрузка оборудования) может потребоваться?
У Вас жёсткое ограничение по ресурсам? Промышленные компы с 64 КБ памяти? Или всё-таки обычные?
У меня Synapse работало с сервером "Ирбис" и единственная проблема которая там возникала - если кол-во запросов больше, чем 1 раз в секунду - сервер вешался и не мог их обработать. Естественно сама Synapse там была совсем не при чём.
Так что про ресурсы Вы вопрос формулируете неправильно - никто Вам на него в таком виде не ответит.
Ресурсы Вы и сами можете посчитать, для этого надо знать:
1. Объём памяти на один используемый компонент (одна выполняемая операция) * количество потоков его использующих.
2. Процессорное время на один используемый компонент (одна выполняемая операция) * кол-во потоков его использующее.
???
Vadim
Да, Вы правы. Библиотека Synapse - это, как я понял, "обёртка" над системными сокетами и ничего существенно она не добавит, как и не убавит (добавляет только удобство пользования). По этому чем бы я не пользовался ситуация одинакова.
А компьютеры у меня обычные (PC-совместимые, правда не последней модели, такие обычно используются в качестве операторских станций). Контролеры мы не рассматриваем, это отдельная тема.
А потребили ресурсов обычно графика и базы.
Рассчитать я не могу, это не готовая система а компонент, который будут использовать для готовых систем другие.
Да, Вы правы. Библиотека Synapse - это, как я понял, "обёртка" над системными сокетами и ничего существенно она не добавит, как и не убавит (добавляет только удобство пользования). По этому чем бы я не пользовался ситуация одинакова.
А компьютеры у меня обычные (PC-совместимые, правда не последней модели, такие обычно используются в качестве операторских станций). Контролеры мы не рассматриваем, это отдельная тема.
А потребили ресурсов обычно графика и базы.
Рассчитать я не могу, это не готовая система а компонент, который будут использовать для готовых систем другие.
