Несколько вопросов по клиент-серверному соединению?

Всем привет. Работаю над проектом клиент-серверного приложения. Сервер пишу на JAVA, а клиент на FreePascal. Схема приложения не сложная. Вводим данные, отправляем их на сервер, там их обрабатываем, отправляем ответ назад, выводим результат на экран. С алгоритмами и кодом ввода, вывода и обработки проблем нет. Есть проблема с передачей. Я в этом вопросе 0. Прочитал несколько статей о сокетах, но понял только как создавать сокеты, и то туманно все, а как с ними работать вообще не понятно.

Отсюда вопросы:
  1. Как правильно передать по сети текст из полей ввода и значения чекбоксов?
  2. Как правильно принять отправленную информацию?
  3. Всегда ли будет один и тот же алгоритм и код, который можно запомнить и всегда использовать?
  4. Как во всем этом участвует протокол HTTP?
  5. Какие есть нюансы при передаче и приеме информации?
  6. Что можете посоветовать в целом по данному вопросу как опытные программисты?

Надеюсь никого своими вопросами не затрудню. Заранее спасибо за ответы.
  • Вопрос задан
  • 461 просмотр
Пригласить эксперта
Ответы на вопрос 4
tsarevfs
@tsarevfs
C++ developer
1. Есть несколько вариантов, но все из них сводятся к тому, что текст, данные форм и прочее нужно представить в виде набора байт. Это называется сериализацией. Это можно делать по разному. Например использовать бинарный формат близкий к тому как эти данные хранятся в памяти. Это достаточно сложно особенно если программы написаны на разных языках. Вам подойдет более высокоуровневый подход на основе JSON (ndjson) или msgpack. Или даже более высокоуровневые решения типа json/msgpack rpc.
2. Прием работает в обратном порядке. Мы принимаем данные в некотором формате и десериализуем их в те структуры данных, которые используются в программе.
3. Уточните вопрос, но ответ скорее всего нет =)
4. Он может участвовать а может и нет. Он работает поверх сокетов. Вероятно для ваших целей он избыточен. Однако смотреть можно в сторону rpc over http или rest api.
5. Основная проблема в том, что операция -"ждать сообщения от клиента / сервера" блокирующая. И если ничего не предпринять, то клиент не сможет реагировать на клавиатуру / мышь, а сервер не сможет работать с несколькими клиентами. Поэтому сетевое общение можно вынести в отдельный поток или использовать какие-то асинхронные механизмы (в паскале с этим не очень похоже).
6. Паскаль возможно не лучший язык для клиента. На той же Java это было бы проще.
Ответ написан
EgorkZe
@EgorkZe
iOS (Swift), GoLang
Если вкратце, то для таких данных лучше писать RESTfull сервер апи, и тогда с клиента вы будете отправлять http запросы post/get/put/delete и сервер будет их обрабатывать и отсылать результаты обратно.
Ответ написан
Комментировать
Konstantin18ko
@Konstantin18ko
Стоматолог
1. Нужно еще понимать, что какой поток данных, то таков и запрос. Если во freePascal напишите поток outputStreamData, а на сервере укажите inputStreamFile, то на выходе пакет не долетит.
Принцип примерно такой:
Поле [Имя]: Александр
Поле [Фамилия]: Петренко
Поле [Возраст]: 11
Чекбокс [Пионер]: Да (ну или галочка)

Запрос строкой:
[name] Александр;
[family] Петренко;
[age] 11;
[pioner] true;

А в Java сканируйте строки на наличие того или иного аргумента и в каком он положении true/false/произвольное.
Ответ написан
Комментировать
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
Чтобы понять принципы делай как можно проще. Например:
1) Представь свою структуру данных точными последовательностями. Скажем у тебя это данные типа "фамилия", "имя", "возраст","в_браке". Типы будут такие string, string, int, boolean. 4 поля данных.
2) Теперь тебе надо сереализовать твою структуру. Переводишь все ("фамилия", "имя", "возраст","в_браке") в байты.
3) На клиенте подключаешься к сокетному серверу, открывается соединение. Берешь первое поле "фамилия" (помним что это у тебя уже байты), считаешь его размер(скажем получилось 17 байт). Переводишь число(int) 17 в байты. Пишешь в сокет серверу байтовое число 17. Затем пишешь туда же все свои 17 байт данных. Повторяешь такое со всеми данными.
4) Сервер запущен и ждет соединения. Клиент подключился, сервер начинает ждать данные. Помним что в п1. у нас заранее известна структура данных. Начинаешь читать из сокета байты размерами int. Прочитал получилось число 17. Читаешь из сокета 17 байт, получилось поле "фамилия", снова читаешь из сокета байты размером int. Узнал из него сколько байт надо прочитать и читаешь их. Таким образом делаешь 4 раза(см. п.1). Теперь остается перевести данные из байт в string, string, int, boolean и получишь на сервере "фамилия", "имя", "возраст","в_браке".
5) Сервер отключает клиента или скажем по такому же принципу шлет ответ.
Все выше написанное сильно кривое но для понимания как работает передача данных по сети самое то.
Что бы перестать бояться сокетов и понять их, представь что это обычные файлы, которые ты открываешь, пишешь и читаешь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы