Russian Qt Forum

Qt => Работа с сетью => Тема начата: Yegor от Май 02, 2016, 12:10



Название: Выбор протокола для обмена данными
Отправлено: Yegor от Май 02, 2016, 12:10
Здравствуйте всем!

Использую Qt самую свежую. У меня есть задача - чтобы установить соединение между клиентом и сервером (по интернету, с помощью OpenVPN).
И чтобы по этому соединению передавать разнородные данные, трех видов:
  • авторизация клиента при подключении его к серверу
  • передача файлов
  • передача просто определенных байтов данных

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

Посоветуйте, пожалуйста, какой протокол соединения лучше для этого использовать? Может HTTP?


Название: Re: Выбор протокола для обмена данными
Отправлено: Old от Май 02, 2016, 12:13
Если мы говорим про интернет и нужна гарантированная доставка данных, то только tcp и остается.


Название: Re: Выбор протокола для обмена данными
Отправлено: qate от Май 02, 2016, 23:16
нужно написать клиент и\или сервер ?


Название: Re: Выбор протокола для обмена данными
Отправлено: nwnclv от Май 04, 2016, 01:41
Возьми любую либу, реализующую RPC. Поверх TCP, да


Название: Re: Выбор протокола для обмена данными
Отправлено: Yegor от Май 12, 2016, 20:46
Цитировать
нужно написать клиент и\или сервер
Да, обмен между клиентом и сервером. Причем клиент должен авторизоваться (логин, пароль) при подключении.

Цитировать
Возьми любую либу, реализующую RPC. Поверх TCP, да
А что такое RPC? Это например SOAP или REST?


Название: Re: Выбор протокола для обмена данными
Отправлено: PimenS от Май 12, 2016, 21:05
Из примеров:

Fortune Server Example
Fortune Client Example

чем не подходят?


Название: Re: Выбор протокола для обмена данными
Отправлено: Yegor от Май 13, 2016, 17:17
В примерах используются Tcp сокеты.

А класс QNetworkAccessManager для чего он? В каких случаях используется?

Подойдет ли использование QNetworkAccessManager для обмена между клиентом и сервером?


Название: Re: Выбор протокола для обмена данными
Отправлено: PimenS от Май 13, 2016, 18:55
Вам нужно:

1. обмен между клиентом и сервером

или

2. отправка запроса серверу и получение ответа

?


Название: Re: Выбор протокола для обмена данными
Отправлено: Yegor от Май 13, 2016, 19:24
Нужен обмен между клиентом и сервером. Интересуют передовые удобные технологи для этой задачи.


Название: Re: Выбор протокола для обмена данными
Отправлено: Old от Май 13, 2016, 19:25
Вам нужно:

1. обмен между клиентом и сервером

или

2. отправка запроса серверу и получение ответа

?
А в чем разница? :)


Название: Re: Выбор протокола для обмена данными
Отправлено: nwnclv от Май 13, 2016, 21:45
Нужен обмен между клиентом и сервером. Интересуют передовые удобные технологи для этой задачи.
Что значит передовые? передовые для чего? Удобство тоже субъективная чтука, которая и от опыта зависит.

а про RPC ... да их тысячи, либ-то,  thrift, grpc. А уж по названию "Qt RPC", так еще больше выдается
Я вообще свою писал, для управления железками типа raspberri :) Так что выбирай какой нравится.


Название: Re: Выбор протокола для обмена данными
Отправлено: PimenS от Май 13, 2016, 23:35
А в чем разница? :)

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


Название: Re: Выбор протокола для обмена данными
Отправлено: ssoft от Май 14, 2016, 07:38
Для понимания задачи необходимо провести декомпозицию

1. Есть желание организовать между компонентами системы взаимодействие по технологии клиент-сервер. Это определенная технология, которая подразумевает разделение логики на серверную и клиентские части. Кто что делает решает программист (аналитик).

2. Существует разные варианты организации обмена сообщениями между компонентами ПО (через файлы, TCP, UDP, РShared memory и т.п.). Среди прочих механизмов есть, например, QTcpServer & QTcpSocket из библиотеки Qt.

3. Для общения клиента и сервера необходим протокол взаимодействия, который определяется конкретной задачей и непосредственно разработчиком. Протокол может быть бинарным, текстовым (XML, JSON и т.п.).

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

На случай взаимодействия по готовым протоколам (http, ftp и др.) существуют готовые решения типа QNetworkAccessManager, однако они предполагают наличие определенного вида сервера, с которым происходит взаимодействие. Если требуется взаимодействие в виде запрос-ответ, то протокол http может подойти.

Если север и клиент ваш собственный и задача специфическая, то протокол и способ взаимодействия вам придется реализовывать самостоятельно.


Название: Re: Выбор протокола для обмена данными
Отправлено: yodu от Май 18, 2016, 11:28
Приветствую, товарищи!

Хотел подобную тему поднять, но раз уже тут есть, напишу сюда. Сейчас мы хотим разделить один проект на 2 части (клиент/сервер). Проект Qt и довольно крупный. И вот встал вопрос о выборе библиотеки, которая позволит:
  • легко описывать вызовы, которые нужно делать удаленно (мне в этом плане нравится формат thrift'a и protobufer'a)
  • поддержка tcp и пайпов
  • проводить имперсонацию клиента (в случае windows и работы серверной части как сервиса под LOCAL_SYSTEM)
  • равноправный клиент и сервер; чтобы сервер мог слать клиентам события/сигналы, делать вызовы на стороне клиентов
  • возможность работать по ssl
  • ...

А, да. библиотка не обязательно на Qt должна быть. потому как клиенты будут еще и для маков/андроидов/винфонов и там не Qt.

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

Спасибо.


Название: Re: Выбор протокола для обмена данными
Отправлено: nwnclv от Май 18, 2016, 23:26
  • легко описывать вызовы, которые нужно делать удаленно (мне в этом плане нравится формат thrift'a и protobufer'a)
Так и бери один из них. В случае протобуфера тебе придется нарисовать свой транспорт. А там уже хоть на Qt, хоть на либевент. В случае трифта вообще уже все готово
  • поддержка tcp и пайпов
  • проводить имперсонацию клиента (в случае windows и работы серверной части как сервиса под LOCAL_SYSTEM)
для трифта есть реализация транспорта named pipe, к хендлу для имперсонации доступ плучить можно. Для протобуфера см. выше
  • равноправный клиент и сервер; чтобы сервер мог слать клиентам события/сигналы, делать вызовы на стороне клиентов
для PB опять же будет зависеть от того, как сделаешь обмен сообщениями, для трифта вроде из коробки можно.
  • возможность работать по ssl
вот для трифта про это не вкурсе. для протобуфера ... ну как обычно. как напишешь.

Помимо этих двух, я тут еще упоминал grpc (http://www.grpc.io/), про его возможности/невозможности я не знаю ничего.

Если будет сильно интересно, можешь еще мой велосипед на С++, Boost и Protobuf посмотреть либа (https://github.com/newenclave/vtrc), некоторе корявенькое описание (https://github.com/newenclave/vtrc/wiki), примеры (https://github.com/newenclave/vtrc/tree/master/examples) вдруг, что интересное оттуда почерпнешь.


Название: Re: Выбор протокола для обмена данными
Отправлено: yodu от Май 19, 2016, 10:02
Спасибо, как раз смотрю gRPC.
Про thrift я так и не понял, может ли там сервер дергать клиента, но пока его только поверхностно глянул.
а вот vtrc выглядит довольно похоже на то, что надо. судя по описанию. буст у нас уже есть, так что с ним тоже поиграюсь. Если что, спрошу  ;)