|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.12.2010, 15:24 | #1 |
Форумчанин
Регистрация: 01.12.2010
Сообщений: 140
|
Разработка сетевых приложений
Здравствуйте. Я знаю основы работы с ClientSocket и ServerSocket. У меня есть некоторые вопросы.
1) Начнём с простого. Я не понимаю, как передавать значение какой-либо переменной клиенту. Скажем, можно конечно переделывать цифры в строку (IntToStr), затем передавать строку посредством SendText и уже расшифровывать данные на сервере, но я уверен, что этот способ неправильный и существует другой, изобретать велосипед не нужно. 2) Допустим каждые 50 мс клиент серверу отправляет какой-либо набор переменных. Допустим две переменные x и y. Предположим, что в программе имеется поле для отправки произвольных сообщений. Клиент напечатал сообщение, данные должны отправиться на сервер. Но как серверу определить, какие данные к нему поступили: раннее упомянутый набор переменных или текст? Мой вариант - это отсылка ещё двух дополнительных переменных, значения которые укажут, что читать. Допустим эти две переменные будут a и b типа byte. Если a = 1 (а оно всегда будет равно 1), то читать набор переменных, если же b = 1, то значит читать и последующий текст. Разумен ли такой способ? Если нет, есть ли другие? Большое спасибо за понимание и внимание, прошу помощи, советов. |
01.12.2010, 15:47 | #2 | |
C++, Java
Старожил
Регистрация: 10.04.2010
Сообщений: 2,665
|
Цитата:
|
|
01.12.2010, 22:40 | #3 |
Пользователь
Регистрация: 25.11.2010
Сообщений: 46
|
пишу игрушку на сокетах.
пользуюсь анализом символов пример: id:35pX:342pY:456 на сервере анализирую строку. Код:
Последний раз редактировалось Daemonghost; 01.12.2010 в 22:49. |
02.12.2010, 06:41 | #4 | |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
Цитата:
Читайте про регулярные выражения (не знаю, правда, как с ними обстоят дела в делфи, но уверен что они там тоже есть, в каком либо виде)
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
|
02.12.2010, 10:26 | #5 | ||||
Форумчанин
Регистрация: 01.12.2010
Сообщений: 140
|
Цитата:
Цитата:
Цитата:
Цитата:
|
||||
02.12.2010, 16:01 | #6 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Ничего не нужно отделять пробелами и переделывать строки в символы, ...достаточно воспользоваться байтовым массивом. Одна ячейка массива - одна цифра от 0 до 255. Ваша запись id:35pX:342pY:456 или 35 342 456 (17 байт и 10 байт) будет весить 4 байта:
Код:
Последовательность считывания заложена в коде команды, в 0-й ячейке. Т.е. через case берется Mas[0] и в зависимости от значения выполняется определенная обработка команды, включая последовательность, составные и упакованные данный. Следует обратить внимание на то, что если у вас в одной команде могут быть как однобайтовые так и двухбайтовые числа, то нужно представлять их все двухбайтовой последовательностью: 0 200 = 200, 1 135 = 390 (1 * 255 + 135) и т.д.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
02.12.2010, 16:24 | #7 |
Форумчанин
Регистрация: 01.12.2010
Сообщений: 140
|
Beermonza, большое спасибо за помощь. Вы всё очень понятно и доступно объяснили.
|
02.12.2010, 16:59 | #8 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Asker13, если понадобится передать отрицательные целые числа, десятичные, тот же текст, это все выполняется в виде последовательности байт, ведь информация любого типа в машинном представлении это, суть, последовательность байт, сетевой поток не исключение.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
02.12.2010, 20:21 | #9 | |
Пользователь
Регистрация: 25.11.2010
Сообщений: 46
|
Цитата:
так же интересует цифра 4, что она обозначает. пытался принять через: Код:
Может я что-то не так делаю? ps. с цифрой 4 разобрался. Последний раз редактировалось Daemonghost; 03.12.2010 в 00:43. |
|
03.12.2010, 01:04 | #10 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Я привел пример заполнения и отправки пакета. SendBuf(Mas, 4) - это стандартная команда сокета на отправку. Если поднести курсор к ней, то можно увидеть что она требует на входе. А именно вот это:
Код:
Стало быть команда SendBuf(Mas, 4) отошлет пакет длинной 4 байта (array[0..3] of byte). Принимать такой пакет нужно уже после того как соединение устаканилось, иначе можно зацепить переписку сокетов во время установки связи. Т.е. нужна пауза от подключения до начала работы с сокетами, ...ну а раз уж эта тема посвящена сетевым приложениям, то в целях обеспечения безопасности и надежности, первым "диалог" должен начинать сервер, ...как бы говоря, после готовности и создания канла: "кто ты такой, назови свое имя", ...клиент должен ответить некоторым пакетом (если клиент начал "болтать" первым, то его нужно отключить). Вот, к примеру, то, что показал выше это ответ клиента. Он прислал данные. Теперь их нужно принять на стороне сервера, используя специальное определение длины пакета, вот так: Код:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разработка приложений для Windows Mobile 6.1 | AlexBonel | Windows | 4 | 08.10.2009 17:44 |
Разработка приложений под Windows Mobile 6.1 | AlexBonel | Помощь студентам | 0 | 05.10.2009 10:40 |
C++ взаимодействие с АЦП/ЦАП и разработка сетевых приложений | iukash | Свободное общение | 4 | 14.08.2009 18:02 |
Создание сетевых приложений в delphi | martinenko | Работа с сетью в Delphi | 6 | 09.05.2009 20:23 |