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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2011, 19:29   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 260
По умолчанию Сокеты. Гарантированное соединение. структура кода

Добрый день! Продолжается разработка клиент-серверного приложения типа РАДМИН (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
в общем, нужна подсказка
Pcrepair вне форума Ответить с цитированием
Старый 19.07.2011, 17:36   #2
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию

по событию onError сделай сразу же реконнект.

мсрдп работае так, да не совсем.
Он постоянно подключен к серверу, НО
он не бездумно шлет картинку, а только тогда, когда мыш на удаленной машине начала перемещаться, либо же, если ЗНАЧИТЕЛЬНАЯ часть картинки притерпела изменения. т.е. у них не 1024*768 кадр тебе идет целиком, а он разбивается на мелкие (какие размеры-врать не буду, по моему 128*128), и смотрит, если эта часть изменилась-то ее шлет клиенту.

Таким образом получается, что у тебя в покое на уделенной машине меняется только нижний правый угол (где трэй с часами). по сути в таком состоянии сервер шлет тебе именно этот кусок и ничего больше.

Собственно, благодаря такой технологии удалось таки сделать такую вот передачу картинки на расстояние по диал-апу, скажем, но опять же при опред. настройках качества самого изображения.


По теме постояных реконнектов
дисконнектов могу сказать- смотри внимательно код.
У меня клиенты к серваку конектятся с утра (100-120 пк) и висят некоторые сутками, некоторые до ухода с работы. плюс минус посыл пакетов от некоторых. Никаких обрывов-разрывов не наблюдалось (логирование прикрутил, чего и тебе советую).
Так что смотри внимательно код.
Dee63 вне форума Ответить с цитированием
Старый 20.07.2011, 19:23   #3
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 260
По умолчанию

где то Я читал, что сервер мсрдп шлет графические примитивы - описание изображения в формате типа текстового + тексты изображения

но сейчас речь не об этом
почемуто при использовании ИНДИ10 (сервер-клиент) при установлении соединения с сервером удается передать на сервер только одну команду, остальные команды из клиента не выполняются.
приходится разрывать соединение и по новой его устанавливать для передачи следующей команды в сервер
кто то может дать комментарий?
Pcrepair вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить в Excel ; Вознаграждение гарантированное warma2d Microsoft Office Excel 5 07.05.2011 22:44
Распознавание Аски кода и скан кода MyLastHit Общие вопросы Delphi 8 06.12.2010 18:34
Структура кода в Delphi 7. Вадим Буренков Общие вопросы Delphi 8 15.03.2009 12:28
Сокеты, получение кода HTML страницы и обработка пропсов ABTOP C/C++ Сетевое программирование 5 19.10.2008 11:49
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51