Консольное приложение и GUI приложение, непонятная проблема

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Консольное приложение и GUI приложение, непонятная проблема

Сообщение LeonidDV » 31.10.2014 11:18:18

Есть программа, своего рода сервер приложений работает с использованием двух компонент Zeos и переписанный n-tier (http://sourceforge.net/projects/laz-n-tier/files/) использует synapse
Проблема в следующем в гуе приложении все работает нормально. к базе подключается, листенер слушает команды и шлет ответы. обмен данными между клиентом и сервером работает на УРА.
Вот код обычного приложения.
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ZConnection,
  ZeosProv,  ZeosDataServer, DB, ServerProc,
  DataProcUtils;

type

  { TForm1 }

  TForm1 = class(TForm)
    Start: TButton;
    ZConnection: TZConnection;
    ZeosDataServer: TZeosDataServer;
    function ZeosDataServerUserLogonCall(UserName, Password: AnsiString):
             TLogonStyle;
    procedure StartClick(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

function TForm1.ZeosDataServerUserLogonCall(UserName, Password:
  AnsiString): TLogonStyle;
begin
  Result := LogedOnServer;
end;

procedure TForm1.StartClick(Sender: TObject);
begin
//  writeln('Starting server...');
//  writeln('Database connection...');
  //init db connect;
  ZConnection:=TZConnection.Create(self);
  ZConnection.AutoEncodeStrings:=False;
  ZConnection.ClientCodepage:='UTF8';
  ZConnection.Catalog:='public';
  ZConnection.Properties.Text:='AutoEncodeStrings=codepage=UTF8';
  //settings
  ZConnection.HostName := '127.0.0.1';
  ZConnection.Database := 'bd';
  ZConnection.User := 'postgres';
  ZConnection.Password := 'xxx';
  ZConnection.Protocol := 'postgresql-9';
  ZConnection.Connect;
  if ZConnection.Connected then
  //   writeln('Conected to: '+ZConnection.User+'@'+ZConnection.Database)
  else
    begin
   //  writeln('Connection ERROR...');
     sleep(5000);
     Application.Terminate;
    end;
// writeln('Init Listener...');
  ZeosDataServer := TZeosDataServer.Create(self);
  ZeosDataServer.ZeosDBConnection := ZConnection;
  ZeosDataServer.AuthRequired := True;
  ZeosDataServer.Port := '8080';
  ZeosDataServer.OnUserLogonCall := @ZeosDataServerUserLogonCall;
  ZeosDataServer.ServerName := 'Avalon';
  ZeosDataServer.Active := True;
  if ZeosDataServer.Active then
//   writeln('Listener started on port: '+ZeosDataServer.Port+' with name '+ZeosDataServer.ServerName)
  else
  begin
   //  writeln('Listener 4 ERROR...');
     sleep(5000);
     Application.Terminate;
  end;

end;

end.


Но мне нужно консольное приложение так как работать все должно на сервере с линуксом. И вот тут проблема
Из конслои к базе подключаемся, листенер поднимается, о чем сообщает фаервол спрашивая разрешение, но потом...
потом видимость что все работает, порт слушается.. А наделе ничего не получает и не отправляет соответственно.
Вот код
Код: Выделить всё
program ServerX;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp, ZConnection,
  ZeosProv,  ZeosDataServer, DB, ServerProc,
  DataProcUtils
  { you can add units after this };

type

  { TServerX }

  TServerX = class(TCustomApplication)
  ZConnection: TZConnection;
  ZeosDataServer: TZeosDataServer;
  function ZeosDataServerUserLogonCall(UserName, Password: AnsiString):
      TLogonStyle;
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
    procedure WriteHelp; virtual;
    procedure Start;
  end;

{ TServerX }

function TServerX.ZeosDataServerUserLogonCall(UserName, Password:
  AnsiString): TLogonStyle;
begin
  Result := LogedOnServer;
end;

procedure TServerX.DoRun;
var
  ErrorMsg: String;
begin
  // quick check parameters
  ErrorMsg:=CheckOptions('h','help');
  if ErrorMsg<>'' then begin
    ShowException(Exception.Create(ErrorMsg));
    Terminate;
    Exit;
  end;

  // parse parameters
  if HasOption('h','help') then begin
    WriteHelp;
    Terminate;
    Exit;
  end;

   Start;

  { add your program here }

  // stop program loop
  Terminate;
end;

constructor TServerX.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
end;

destructor TServerX.Destroy;
begin
  inherited Destroy;
end;


procedure TServerX.Start;
begin
  writeln('Starting server...');
  writeln('Database connection...');
  //init db connect;
  ZConnection:=TZConnection.Create(self);
  ZConnection.AutoEncodeStrings:=False;
  ZConnection.ClientCodepage:='UTF8';
  ZConnection.Catalog:='public';
  ZConnection.Properties.Text:='AutoEncodeStrings=codepage=UTF8';
  //settings
  ZConnection.HostName := '127.0.0.1';
  ZConnection.Database := 'bd';
  ZConnection.User := 'postgres';
  ZConnection.Password := 'xxx';
  ZConnection.Protocol := 'postgresql-9';
  ZConnection.Connect;
  if ZConnection.Connected then
     writeln('Conected to: '+ZConnection.User+'@'+ZConnection.Database)
  else
    begin
     writeln('Connection ERROR...');
     sleep(5000);
     Terminate;
    end;
  writeln('Init Listener...');
  ZeosDataServer := TZeosDataServer.Create(self);
  ZeosDataServer.ZeosDBConnection := ZConnection;
  ZeosDataServer.AuthRequired := True;
  ZeosDataServer.Port := '8080';
  ZeosDataServer.OnUserLogonCall := @ZeosDataServerUserLogonCall;
  ZeosDataServer.ServerName := 'Avalon';
  ZeosDataServer.Active := True;
  if ZeosDataServer.Active then
    writeln('Listener started on port: '+ZeosDataServer.Port+' with name '+ZeosDataServer.ServerName)
  else
  begin
     writeln('Listener 4 ERROR...');
     sleep(5000);
     Terminate;
  end;
  readln();

end;

procedure TServerX.WriteHelp;
begin
  { add your help code here }
  writeln('Usage: ',ExeName,' -h');
end;

var
  Application: TServerX;
begin
  Application:=TServerX.Create(nil);
  Application.Run;
  Application.Free;
end.



Причины такого поведения, если честно не понятны. Нет ни ошибок, ни как ких-то признаков нестандартного поведения. Просто не принимает пакеты от клиента и именно в консольном приложении.
Может быть кто знает в чем может быть проблема. В чем кардинальная разница наследников или у консольной есть какие то особенности, по работе с сетью или в работе с потоками.
Уже все перебрал, ну не понимаю одного, почему?

PS пока все пишится и отлаживается на Win7 x64 (приложения x86) (lazarus 1.2.6 fpc 2.6.4)
LeonidDV
незнакомец
 
Сообщения: 7
Зарегистрирован: 31.10.2014 10:49:07

Re: Консольное приложение и GUI приложение, непонятная пробл

Сообщение Vadim » 01.11.2014 10:48:32

А если запротоколировать работу клиента?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Консольное приложение и GUI приложение, непонятная пробл

Сообщение stanilar » 02.11.2014 08:51:02

LeonidDV писал(а):И вот тут проблема


Непонятная проблема. То ли не работает код, скомпилированный под линух, то ли не работает консольный вариант.

Ну и вопрос на засыпку: демки, в нужном Вам варианте, нормально работают?
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Консольное приложение и GUI приложение, непонятная пробл

Сообщение Alex2013 » 03.11.2014 15:09:09

Права доступа у консоли и GUI могут отличатся
Консольное приложение как бы являться частью среды командной оболочки
(возьмите и запустите для теста свое приложение под sudo ) :idea:
Если у вас виндовс то просто зайдите под админом и выключите файрвол / антивирус ...
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 234

Рейтинг@Mail.ru