Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация клиент-сервер 
:(
    Опции темы
Mr_Nuke
Дата 19.12.2011, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Всем привет! Только вчера начал изучать клиент-серверную связь. 
Столкнулся с проблемой, от сервера к клиенту хочу передать два слова типа String
При этом, хочу что бы клиент так же принял их раздельно и записал в разные переменные. 
Но клиент записывает их в одну строковую переменную. 

Использую обычный Socket.ReceiveText и Socket.SendText
PM MAIL   Вверх
Gnus
Дата 19.12.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 22.11.2010
Где: СПб

Репутация: нет
Всего: нет



используйте маркер окончания посылки, чтобы их разделять. на принимающей стороне анализируйте посылку на наличие маркера и разделяйте строки.
PM   Вверх
Mr_Nuke
Дата 19.12.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Это не совсем подойдет. Ожидается, что обе строки будут больше 200 символов. Боюсь, что когда клиент соединит обе строки в одну, часть данных может потеряться. 
В принципе, если бы можно было передать массив строк, это бы подошло. Нашел такой код:
Сервер:
Код

var
  Buf: array[0..3] of Byte;
begin
  ServerSocket.Socket.Connections[0].SendBuf(Buf,4)
end;


Клиент
Код

var
  len: Byte;
begin  
    
  len:=Socket.ReceiveLength;
  Socket.ReceiveBuf(Buf,len);
end;


Все работает, но если в описании типа массива Byte заменить на String, передается ерунда...
PM MAIL   Вверх
Чучмек
Дата 19.12.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



Цитата(Mr_Nuke @  19.12.2011,  18:11 Найти цитируемый пост)
но если в описании типа массива Byte заменить на String, передается ерунда... 

Еще бы не ерунда.
Ты передаешь четыре указателя, которые имеют смысл только в адресном пространстве сервера.
Теперь из клиента передай серверу обратно эти указатели. И "попроси", чтобы сервер вернул данные, на которые указывают эти указатели. smileГЫsmile   


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Mr_Nuke
Дата 19.12.2011, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Да, о том, что передаются указатели, как-то не подумал  smile 
Так как мне можно передать, уж грубо говоря текст, длинной символов в 600?
PM MAIL   Вверх
Чучмек
Дата 19.12.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



Цитата(Mr_Nuke @  19.12.2011,  18:49 Найти цитируемый пост)
текст, длинной символов в 600

array[0..599]of char

Добавлено @ 19:09
Для передачи массива строк (последовательностей данных не фиксированной длинны) нужно передать: 
N:integer //Количество строк
mL:array[0..N-1]of integer //размеры строк 
data:array[0..mL[0]+mL[1]+...+mL[N-1]-1]of char//сами строки   


Это сообщение отредактировал(а) Чучмек - 19.12.2011, 19:11


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Mr_Nuke
Дата 19.12.2011, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Чучмек  Крута! Но пока разбираюсь с символами

Сервер
Код

var
  buff: array [0..3] of char;
begin
  buff[0] := 'b';
  buff[1] := 'a';
  buff[2] := 'b';
  buff[3] := 'd';

  Socket.SendBuf(buff,4);
end;


Клиент
Код

var
  buff : array [0..3] of char;
begin
   Socket.ReceiveBuf(buff,4);
end;



Клиент получает
Buf
  [0] = 'b'
  [1] = 'a'

Последние 2 символа не совпадают, при том третий постоянно меняется с каждым запуском программы

Это сообщение отредактировал(а) Mr_Nuke - 19.12.2011, 19:40
PM MAIL   Вверх
Чучмек
Дата 19.12.2011, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



А какая дельфа?


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Mr_Nuke
Дата 19.12.2011, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Embarcadero RAD Studio 2010
PM MAIL   Вверх
Чучмек
Дата 19.12.2011, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



ReceiveBuf(buff,8)


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Mr_Nuke
Дата 19.12.2011, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Жестко! Но помогло! Чучмек, спасибо, очень выручил  smile 
PM MAIL   Вверх
Чучмек
Дата 19.12.2011, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



Ну теперь пробуй строку передать

На сервере:
Код

s:string;

SendBuf(pchar(S)^,(length(S)+1)*sizeof(Char)); 


На клиенте
Код

s:pchar
l:integer;

l:=Socket.ReceiveLength;
getMem(s,l);
ReceiveBuf(s^,l) 



s:=getMem(l);


Это сообщение отредактировал(а) Чучмек - 19.12.2011, 20:03


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Mr_Nuke
Дата 19.12.2011, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



 smile 
Правда теперь, когда могу передать массив, передавать строку уже не нужно, с массивом даже проще! Но для саморазвития, очень даже полезно  smile 


П.С. Читая твои ответы, невольно задумываешься над подписью 
Цитата

умную мысль держи при себе, а дурной - поделись с другими 
 smile 
PM MAIL   Вверх
kami
Дата 21.12.2011, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(Mr_Nuke @  19.12.2011,  20:47 Найти цитируемый пост)
Правда теперь, когда могу передать массив, передавать строку уже не нужно, с массивом даже проще! 

Чуть испорчу настроение smile
И то и другое - до тех пор, пока передача производится в пределах одного компьютера или (максимум) - в незагруженной трафиком локалке. Что будет, если (вполне реальная ситуация) передаем 2 посылки по 8 байт в каждой; при первом OnReceive придет 2 байта, а все остальные - при втором вызове события?
Практически то же - для передачи. Буфер сокета может быть забит под завязку, и отправятся далеко не все данные, которые хочется передать. А в 
Цитата(Mr_Nuke @  19.12.2011,  18:11 Найти цитируемый пост)
ServerSocket.Socket.Connections[0].SendBuf(Buf,4)
 это не отрабатывается.
Сие достаточно желательно учитывать, потому что при простом дебаге такие штуки отловить нереально, а жизнь приложению испортится по максимуму.

P.S. Может, это всё и есть, просто из постов и кода не видно.
PM MAIL WWW   Вверх
artmaestro
Дата 21.12.2011, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 8.11.2010

Репутация: 1
Всего: 1



Массив из строк таким же образом можно передавать ?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0858 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.