Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2015, 14:49   #1
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
Печаль Получение IdTCPClient'ом сообщения

Доброго времени! До последнего времени использовал в своих приложениях ServerSocket+ClientSocket и горя не знал. Но пришло время и понадобилось быстрое решение передачи данных (больших списков, файлов). В одном из примеров на Инди передается (от клиента серверу) список (TStringList) очень хорошо и быстро в потоке, чего не получается со старыми компонентами. И всё вроде-бы хорошо, начал переделывать свой проект под Инди, но не всё так просто, Сервер принимает и отправляет сообщения без проблем, а вот как принимает сообщения Клиент? ...
Два дня шарил инет ... как понял он (клиент) это делает по таймеру (не по событию onread как в ClientSocket). Только как это реализовать? не один из примеров в сети не работает. Структура компонентов Инди вообще заоблачная , потеряться можно.
Пожалуйста! Подскажите как правильно и корректно принимать и получать сообщения в Инди. Ужа парюсь...

Подключение между сервером и клиентом проходит нормально, по событиям
От клиента передаю сообщение серверу :
Код:
IdC1.IOHandler.WriteLn('СООБЩЕНИЕ');
Сервер принимает его и отвечает :
Код:
RS:=AContext.Connection.Socket.ReadLn;
  .....
  AContext.Connection.SendCmd('ОТВЕТ');
или
  AContext.Connection.Socket.WriteLn(OUTS);
или
  AContext.Connection.IOHandler.WriteLn(OUTS);
..а как клиент узнает что ему пришло сообщение и как считать данные с сокета?

ТЕЛО таймера:
Код:
 ST:=IdC1.Socket.ReadLn; ???...
..сыпятся ошибки, виснет приложение, а получения данных нет.
Велкам! :D http://radiomedtech.ucoz.ru

Последний раз редактировалось Stilet; 09.08.2015 в 16:00.
100GRamm вне форума Ответить с цитированием
Старый 09.08.2015, 16:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Таймер и INDI это неудачный брак...
Покажи свой проект, как ты там чего передавал.
Цитата:
больших списков, файлов
Списки рекомендую передавать через IdHTTP а файлы idFTP.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 16:36   #3
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Таймер и INDI это неудачный брак...
Покажи свой проект, как ты там чего передавал.

Списки рекомендую передавать через IdHTTP а файлы idFTP.
Можно ли совмещать эти компоненты ? Я попробовал переложить на Инди передачу списков и файлов, а на клиентсокете оставить команды и синхронизацию событий. Но Инди ругаться вздумал, сказал что адрес и порт уже заняты.. (хотя порты разные, судя по названию порта в инди defaulport.. Портов он юзает скрытно немерено, от туда и скорость)


Проект работает уже два года, но на Cliensocket+Serversocket.
Основные функции проекта: База данных и хранение привязанных к ней файлов.
Весь проект огромен (800мб), выкладывать его нет смысла: он работает.
Взялся за Инди потому как списки стали очень огромные (на данный момент 30000 записей и это только начало..).
Велкам! :D http://radiomedtech.ucoz.ru
100GRamm вне форума Ответить с цитированием
Старый 09.08.2015, 17:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но Инди ругаться вздумал
Текст ругани в студию.
Цитата:
Портов он юзает скрытно немерено, от туда и скорость
Это откуда такие сведения? О_о
Цитата:
Взялся за Инди потому как списки стали очень огромные
Только из-за этого?
Вообще тебе ИМХО вполне можно обойтись одним IdTFP. Он заточен и под команды и под перегонку огромного кол-ва инфы. Вполне хватит. Cliensocket+Serversocket с ним синхронизировать не надо. Не потому что не будет работать - будет, а потому что нет смысла.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 17:37   #5
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Текст ругани в студию.
блин, пробую восстановить события, но уже не получается)))

Цитата:
Это откуда такие сведения? О_о
це догадка ))
Велкам! :D http://radiomedtech.ucoz.ru
100GRamm вне форума Ответить с цитированием
Старый 09.08.2015, 17:57   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Неудачная догадка. Однажды такие догадки могут тебе выйти боком.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 18:03   #7
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

Попробовал вот так передать хорошую таблицу (200 000 записей (строк из sl) за 5 сек через поток)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  FS: TMemoryStream;   i,k:integer; s:string;
  sl:tstringlist;
begin
  sl:=tstringlist.Create;  sl.Clear;
  IdTCPClient1.Connect;
  FS := TMemoryStream.Create;  FS.Clear;
  for I := 0 to sg.RowCount - 1 do
     begin
     s:='';
     for k := 0 to sg.ColCount - 1 do if k<>0 then s:=s+'|'+sg.Cells[k,i] else s:=sg.Cells[k,i];
     sl.Add(s);
     end;
     sl.SaveToStream(fs);
  ProgressBar1.Max:=sizeof(sl);
  ProgressBar1.Position := 0;
  FS.Position:=0;
  IdTCPClient1.IOHandler.Write(FS, FS.Size, True);
  FS.Free;
  IdTCPClient1.Disconnect;
end;
а так ее получить:
Код:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  FS: TMemoryStream;
begin
  self.Caption:= AContext.Connection.Socket.Binding.PeerIP;
  FS := TMemoryStream.Create;
  AContext.Connection.IOHandler.ReadStream(FS);
  fs.Position:=0;
  memo1.Lines.LoadFromStream(FS);
  Fs.Free;
end;
то мне и понравилось)) у меня такой объем минуты две грузиться будет (правда это с отрисовкой грида)
Только, похоже, в обратную сторону то не пойдет((
Велкам! :D http://radiomedtech.ucoz.ru

Последний раз редактировалось Stilet; 09.08.2015 в 19:48.
100GRamm вне форума Ответить с цитированием
Старый 09.08.2015, 19:49   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

1) Что передаешь? Данные для базы? А почему не через SQL?
2) Что значит "в обратную не пойдет"?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2015, 20:30   #9
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
1) Что передаешь? Данные для базы? А почему не через SQL?
2) Что значит "в обратную не пойдет"?
скуел-скучно, а обратно значит от сервера к клиенту
Велкам! :D http://radiomedtech.ucoz.ru
100GRamm вне форума Ответить с цитированием
Старый 09.08.2015, 21:00   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
скуел-скучно
Жесть...
Цитата:
а обратно значит от сервера к клиенту
Тот же принцип - на сервере ставится компонент клиента. Короче все ПО выступает как клиентом так и сервером.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
idtcpclient kostya67 Работа с сетью в Delphi 4 04.11.2013 14:06
TICQClient получение сообщения Rec0il Общие вопросы Delphi 3 31.03.2013 21:34
Получение сообщения idUDPClient virtuhay266 Работа с сетью в Delphi 1 07.12.2011 08:33
idTCPClient не отправляет сообщения TwiX Работа с сетью в Delphi 2 09.03.2010 23:56
IRC получение сообщения jone Работа с сетью в Delphi 4 27.04.2009 21:20