Показать сообщение отдельно
  #1  
Старый 18.07.2011, 19:40
Pcrepair
 
Сообщения: n/a
По умолчанию Сокеты. Гарантированное соединение. структура кода

Добрый день! Продолжается разработка клиент-серверного приложения типа РАДМИН (D2010 + INDY10)
Предыдущая версия работает, но работает не по правилам - постоянно идет коннект-дисконект с сервером при передаче скрина экрана сервера и передаче данных мыши с клиента на сервер. Из-за этого идет торможение, дерганье экрана. Надо это исправить

Клиент должен работать следующим образом:
- при нажатии на кнопку CONNECT клиент подключается к серверу
- таймер (а может можно как то синхронизировать с дисплеем, чтоб изображение не дергалось?) отправляет на сервер координаты курсора мыши и информацию о нажатии кнопок мыши клиента, далее отправляет запросы на сервер о пересылке файла со скрином экрана сервера каждые 20 мС (или с частотой обновления экрана?) и отображает на TImage полученный файл
- это должно продолжаться пока не пойдет команда на отключение клиента от сервера оператором. вопрос - правильно ли это? постоянное подключение к серверу? MSRDP Client именно так ведь и работает
- при повторном нажатии на кнопку CONNECT, клиент отключается от сервера

Подскажите структуру кода клиента, обеспечивающую:
- гарантированное соединение клиента с сервером, при разрыве автоматически восстанавливающее соединение
- вывод сообщения, наверно на компонент LABEL? о разрыве соединения. или в отдельное модальное окно? как правильно?

пока есть вот такой код
Код:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, Zlib;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    TabSheet6: TTabSheet;
    TabSheet7: TTabSheet;
    TabSheet8: TTabSheet;
    TabSheet9: TTabSheet;
    TabSheet10: TTabSheet;
    HOST: TEdit;
    PortNumber: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Image1: TImage;
    IdTCPClient1: TIdTCPClient;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure connect_to_server;
    procedure DecompressStream; //декомпрессия сжатого на стороне сервера файл.бмп
  end;

var
  Form1: TForm1;
  Stream: TMemoryStream;

implementation

{$R *.dfm}

procedure TForm1.DecompressStream;
var
 pOut: Pointer;
 outSize: Integer;
begin
 ZDecompress(Stream.Memory, Stream.Size, pOut, outSize);
 try
     Stream.Clear;
   Stream.WriteBuffer(pOut^, outSize);
 finally
   FreeMem(pOut);
 end;
end;

procedure TForm1.connect_to_server;
begin
 IdTCPClient1.Host:=HOST.Text;
 IdTCPClient1.Port:=StrToInt(PortNumber.Text);
 IdTCPClient1.Connect;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   connect_to_server;
end;

end.
как то тут надо написать типа
with IdTCPClient1 do
или
while connected do
в общем, нужна подсказка
Ответить с цитированием