Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Indy


Автор: Kirgston 23.9.2008, 20:59
Всем доброго времени суток! Помогите чуток с прогой  как мне написать код чтоб клиент присоеденялся и считывал то что написано в РичЕдите и записывал в свой РичЕдит.
Вот вроде сервер написал...
Код:


Код

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var s:string;
i:integer;
begin
for i := 0 to RE.Lines.Count - 1 do

s:=RE.Lines[i];
Write(s);
end;


А как клиент сделать?
Спасибо!

Автор: SneG0K 25.9.2008, 18:12
Цитата(Kirgston @  23.9.2008,  19:59 Найти цитируемый пост)
А как клиент сделать?

Руками! Чтоб он читал из того ричедита и передавал в сеть!

Автор: Kirgston 25.9.2008, 22:18
Угу все такие умные на словах. А на деле? 
Знал бы не спрашивал!

Автор: Matematik 26.9.2008, 00:11
Судя по AContext: TIdContext, у тебя Indy10.
Под рукой его нет, в Indy9 делается так
Сервер:
Код

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  mem : TMemoryStream;
  BufSize : Integer;
begin
  mem := TMemoryStream.Create;
  try
    RichEdit1.Lines.SaveToStream(mem);
    mem.Position := 0;
    BufSize := mem.Size;
    AThread.Connection.WriteInteger(BufSize);
    AThread.Connection.WriteStream(mem);
  finally
    mem.Free;
  end;
  AThread.Connection.Disconnect;
end;

Клиент:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  mem : TMemoryStream;
  BufSize : Integer;
begin
  IdTCPClient1.Host := '169.254.1.2';
  IdTCPClient1.Port := 12345;
  IdTCPClient1.Connect;
  mem := TMemoryStream.Create;
  try
    BufSize := IdTCPClient1.ReadInteger;
    IdTCPClient1.ReadStream(mem, BufSize);
    mem.Position := 0;
    RichEdit1.Lines.LoadFromStream(mem);
  finally
    mem.Free;
  end;
  IdTCPClient1.Disconnect;
end;


Автор: Kirgston 26.9.2008, 07:48
о! Огромное спасибо! Вопросик по Инди 10. Ну у меня всегда стоит последний делфи )))) , но например если я откомпилирую на Делфи 2009 то работать не будет? Почему в Инди 10 я нормально немогу сделать чужой ИП? Только свои (локалка, ван ип, лан ип) . У меня ещо проблемка ))))) я перекомпилировал проект Делфи 2007 в Делфи 2009. Но как я понимаю Инди 9 в Делфи 2007. Можно как то вернуть из Делфи 2009 в Делфи 2007? smile И что такое Мемори Стрим? И почему вы зделали через потоки? БОЛЬШОЕ СПАСИБО!!! 

Автор: Matematik 26.9.2008, 09:38
Между 9 и 10 не так много внешних различий (внутри очень! разные). Вместо AContext стало AThread
Возможно, просто замети AThread.Connection.Write на AContext.Connection.Write, бедет работать.

> И что такое Мемори Стрим?
Memory - память
Stream - поток
Грубо - представляет память как поток байтов, так же как FileStream - файловый поток

Код
Код

RichEdit1.Lines.SaveToStream(mem);

Сохраняет содержимое ричьедит в память, откуда удобно отослать клиенту

> И почему вы зделали через потоки?
Какие потоки? 
В рус. яз. запутано 
Stream - поток 
Thread - поток
А суть разная.
Использую Stream потому что удобно, меньше кода писать самому.
AThread - это тоже самое что AContext, название и класс разные, а функции одинаковые.
У TIdTCPServer каждое соединение с клиентом выполняется в отдельном потоке(thread) - это код в ф-ции IdTCPServer1Execute().
Так вот переменная AThread (AContext) эт информация о потоке (thread) где код выполняется + инф о соединение с клиеном.




Автор: Kirgston 26.9.2008, 11:51
Ясненько понял

Код

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  mem : TMemoryStream;
  BufSize : Integer;
begin
  mem := TMemoryStream.Create;
  try
    RE.Lines.SaveToStream(mem);
    mem.Position := 0;
    BufSize := mem.Size;
    AContext.Connection.[color=red]WriteInteger[/color](BufSize);
    AContext.Connection.[color=red]WriteStream[/color](mem);
  finally
    mem.Free;
  end;
  AContext.Connection.Disconnect;
end;


Но Аконтекст както подругому работает с данными. У него нету записи и чтения :(

Автор: Matematik 26.9.2008, 12:11
Мдя, недодалана 10 версия.
Не хватает удобных методов.
Вот из-за таких вещей предпочитаю 9ку.

Автор: Kirgston 26.9.2008, 12:53
Но 9ка для Делфи 7 максимум. На Делфи 2007 непойдет :( 
Ладно щас както постараюсь сделать :Р
А если мне использовать 10 и 9. Приложение будет работать?
10 для клиента, 9 для сервера.

Добавлено через 2 минуты и 15 секунд
Нет низя нормально работать так :( 10 вобще так не работает. Можна както установить на делфи 2007 или делфи 2009 инди 9?

Автор: Matematik 26.9.2008, 14:20
> Но 9ка для Делфи 7 максимум. На Делфи 2007 непойдет :( 
Странно, как раз в 2007 работает 9ка

> А если мне использовать 10 и 9. Приложение будет работать?
> 10 для клиента, 9 для сервера.
Если правильно писать, то без разницы на чем написан сервер\клиент, хоть на чистом WinSock API

Автор: Kirgston 26.9.2008, 15:18
Может у меня 9ка не работает изза того что я поставил Делфи 2007 + Делфи 2009?

Автор: Kirgston 19.10.2008, 11:27
Ребята. Ктото уже работал с Инди 10? Как мне например с сервера передать Поток данных?

Автор: MetalFan 19.10.2008, 15:34
нормально работает 10ка и все в ней хватает. просто некоторые методы и св-ва переместились в другие места

Автор: Kirgston 19.10.2008, 17:07
MetalFan, 
Пожалуйста!!! Ну уж очень прошу помоги. Я уже всё перелазил, всё обыскал... ну не могу.... если клиент читает Поток, то сервер не может отослать, если сервер отсылает строку то клиент не может прочитать... 
Пожалуйста. Ну просто умоляю перепиши метод Математика в Инди 10. Я уже через сокеты пытался... читал ДРКБ... но там надо компонент СокетСервер, но прочёл что изза того что он слабый его удалили. И надо через Инди... пожалуйста скажи хоть намёк как сделать... я уже скоро сума сойду :(

 smile 

Автор: MetalFan 19.10.2008, 19:14
выложи пример неработающего приложения. самому влом эксперементировать.

Автор: Kirgston 19.10.2008, 19:54
http://forum.vingrad.ru/index.php?showtopic=229565&view=findpost&p=1650758

Вот на Инди 9 smile А своё я просто не могу никак запустить... :( ну не пойму я как передавать данные. Если в Инди 9 все просто. Врайт\Риид. То тут... пожалуйста помоги! smile 

Автор: Kirgston 20.10.2008, 21:07
Ребята. С клиентом я разобрался. А как на щет сервера? Как мне послать MemoryStream, ну там есть например WriteStream, WriteInteger? А то я нашёл там в клиенте такое, а вот в компоненте сервера уже не могу :(

Автор: Kirgston 21.10.2008, 09:50
Ребята. Спасибо большое ! smile Уже понял как делать, но у меня опять таки проблемка...смотрите

Сервер:
Код
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var Stream:TMemoryStream;
BufSize:integer;
begin
Stream:=TMemoryStream.Create;
RE.Lines.SaveToStream(Stream);
BufSize:=Stream.Size;
AContext.Connection.IOHandler.Write(BufSize);
AContext.Connection.IOHandler.Write(Stream,BufSize);
end;


Клиент:
Код
procedure TForm3.RefreshClick(Sender: TObject);
var Stream : TMemoryStream;
  BufSize : Integer;
begin
 Stream:=TMemoryStream.Create;
 Client.Connect;
  try
    BufSize := Client.IOHandler.ReadInt64(true);
    Client.IOHandler.ReadStream(Stream, BufSize);
    Stream.Position := 0;
    RE.Lines.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
  Client.Disconnect;
end;


Где я тут чтото не то зделал? smile Подскажите пожалуйста!

Автор: MetalFan 21.10.2008, 13:49
и что происходит в итоге?
Цитата(Kirgston @  21.10.2008,  09:50 Найти цитируемый пост)
AContext.Connection.IOHandler.Write(Stream,BufSize);

попробуй просто
Код

AContext.Connection.IOHandler.Write(Stream);


Автор: Kirgston 21.10.2008, 18:19
Неа :( нельзя... пишет недостаточно параметров...

Автор: Matematik 21.10.2008, 18:26
Похоже отправляешь Integer, а читаешь Int64/
Определись с типом BufSize: Integer (4байта) или Int64 (8байт)

Автор: Kirgston 21.10.2008, 19:27
Ой ))) 100% Ребята. Всё работает! Прийду - поставлю всем + ;) но ещо помогите пожалуйста. Почему оно орет что IdSocketError? И почему я немогу переподключится? Я же зделал в конце Дисконект О.о

Автор: Kirgston 22.10.2008, 15:45
о! Всё разобрался ! ;) просто надо было переделать с Интежера в Инт64 smile
Но почему у меня не отсоединяется клиент? Я написал

Код
Client.Dissconect;


Но если я ещё раз подсоединяюсь то пишет "Alredy connected" почему так?

И почему ещё http://s58.radikal.ru/i159/0810/3a/54c9e5aec111.jpg ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)