Fórum SOCKET PROBLEMAS COM A PERDA DE CONEXAO #411586

16/01/2012

0

SOCKET PROBLEMAS COM A PERDA DE CONEXÃO
AQUI NO MEU EMPREGO TEM UMA APLICATIVO DE PONTO QUE ARMAZENA NA BASE LOCAL
E DEPOIS NA BASE SERVIDORA, FAZENDO A SICRONIZAÇÃO DAS DUAS BASES NO PRAZO DE 2 MINUTOS UTILIZANDO UM TIME(tmrSincronizacao)
NA BASE SERVIDOR QUANDOR CAI A CONEXAO COM A REDE O APLICATIVO FICA TENTANDO ABRIR A CONEXAO E NÃO CONSEGUI, MAS O PROBLEMA ESTA QUANDO A CONEXAO VOLTA
, ESSA CONEXAO PERDIDA O SISTEMA NÃO CONSEGUI RECONECTAR NA BASE SERVIDOR FICA DADO A MENSAGEM DE HOST PERDIDO. FOI FORÇADO O CANCELAMENTO DE UMA CONEXAO EXISTENTE PELO HOST REMOTO
ELE TEM UM TIME
NO FORM PRICIPAL
object tmrSincronizacao: TTimer
Enabled = False
Interval = 1000
OnTimer = tmrSincronizacaoTimer
Left = 136
Top = 64
//ELE TESTA SE ESTA CONECTADO A BASE SERVIDORA
if v_computador = REMOTO then
begin
tmrSincronizacao.Interval := StrToInt(RetornaParametroConeccao(RELOGIO VIRTUAL, INTERVALO_SINCRONIZACAO, ARQUIVO_CFG)) * 60 * 1000;
tmrSincronizacao.Enabled := true;
Sincronizar();
end;

/*No evento oncreate eu carrego a s configuraçoes
Da base local a servidora estou utilizando ClientSocket1 e ServerSocket1 e crie uma thead para testar a conexao com a rede*/

sDirTxt := RetornaParametroConeccao(RELOGIO VIRTUAL,
DIRETORIO ARQUIVO TEXTO, ARQUIVO_CFG);
sMsgUsuario := RetornaParametroConeccao(RELOGIO VIRTUAL,
MENSAGEM USUARIO, ARQUIVO_CFG);
sMsgDefault := RetornaParametroConeccao
(RELOGIO VIRTUAL, MENSAGEM PADRAO, ARQUIVO_CFG);
bHideBar := (RetornaParametroConeccao(RELOGIO VIRTUAL,
OCULTAR BARRA WINDOWS, ARQUIVO_CFG) = SIM);
iTamanhoMat := strtoint(RetornaParametroConeccao(RELOGIO VIRTUAL,
TAMANHO MATRICULA, ARQUIVO_CFG));

buscarMatriculaAntiga := (RetornaParametroConeccao(RELOGIO VIRTUAL, BUSCA PELA MATRÍCULA ANTIGA, ARQUIVO_CFG) = SIM);

iTempoMsg := strtoint(RetornaParametroConeccao(RELOGIO VIRTUAL,
TEMPO MENSAGEM USUARIO, ARQUIVO_CFG));
edtMatricula.MaxLength := iTamanhoMat;
pnlTitulo.Caption := RetornaParametroConeccao(RELOGIO VIRTUAL,
TITULO TELA PRINCIPAL, ARQUIVO_CFG);
mascaraMatricula := 0;
CharOf(mascaraMatricula, 0, iTamanhoMat, tpLeft);

if fileexists(ExtractFilePath(Application.ExeName) + logo.bmp) then
Image1.picture.LoadFromFile(ExtractFilePath(Application.ExeName)
+ logo.bmp);

// Banco Local
DmCadastro.conn.Params.Clear;
DmCadastro.conn.Params.Values[DriverPackageLoader] :=
RetornaParametroConeccao(CONEXAO, DriverPackageLoader, ARQUIVO_CFG);
DmCadastro.conn.Params.Values[VendorLib] := RetornaParametroConeccao
(CONEXAO, VendorLib, ARQUIVO_CFG);
DmCadastro.conn.Params.Values[Database] := RetornaParametroConeccao
(CONEXAO, databaseRemoto, ARQUIVO_CFG);
DmCadastro.conn.Params.Values[User_Name] := RetornaParametroConeccao
(CONEXAO, username, ARQUIVO_CFG);
DmCadastro.conn.Params.Values[Password] := RetornaParametroConeccao
(CONEXAO, password, ARQUIVO_CFG);
DmCadastro.conn.KeepConnection := False;
// Banco Local
dmLocal.connRemoto.Params.Values[Database] := RetornaParametroConeccao
(CONEXAO, databaseLocal, ARQUIVO_CFG);
//E preciso implementar pra ser buscado por uma variavel
try
DmCadastro.ClientSocket1.Address := 192.168.1.90;
dmCadastro.ClientSocket1.Port := 3050;
// dmCadastro.ServerSocket1.Port := 3050;
// dmCadastro.ServerSocket1.Port := 2018;
dmCadastro.ClientSocket1.Active := true;
// dmCadastro.ServerSocket1.Active := true;
except
on e:ESocketError do
begin
Application.MessageBox(PCHAR(e.Message),PC_CLOCK,MB_OK + MB_ICONERROR);
end;
end;


// if (dmCadastro.ServerSocket1.Active = true) and (dmCadastro.ClientSocket1.Active = true)then
// begin
// ShowMessage(Conectou);
// end else
// begin
// ShowMessage(Não Conectou);
// end;
// Abre o Banco Remoto
try
if not DmCadastro.conn.Connected then
DmCadastro.conn.Connected := true;
trabalharONLINE();
except
trabalharOFFLINE();
end;

try
if not dmLocal.connRemoto.Connected then
dmLocal.connRemoto.Connected := true;
except
on e: Exception do
Application.MessageBox(Pchar(e.Message), PC-Clock, MB_OK + MB_ICONERROR);
end;
//CRIER UMA THREAD PARA TESTAR A CONEXAO

unit ServerThread;

interface

uses
SysUtils, Messages, SyncObjs, Classes {$IFDEF MSWINDOWS} , Windows, ScktComp, Winsock {$ENDIF};
// ClientSocket1: TClientSocket;
// ServerSocket1: TServerSocket;

type
TClientServer = class(TCustomSocket)
public
private
protected
end;

type
TServer = class(TThread)

Socket :TCustomWinSocket;

// TServer = class(TComponent)
protected


private
FAddress :String;
FPort: Integer;
Conectado: boolean;
procedure CScan; virtual;
public
ClientSocket :TClientSocket;
bConectado : Boolean;
procedure Execute; override;
constructor Criar(aSocket:TCustomWinSocket;aFAddress :String; aFPort: Integer);
destructor Destroy; override;
procedure conectar();
procedure VerificaStatusConexao(Sender: TObject; Socket: TCustomWinSocket);

end;

implementation

uses untDmCadastro, iniFiles, Dialogs, Forms;

{
Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure TServer.UpdateCaption;
begin
Form1.Caption := Updated in a thread;
end;

or

Synchronize(
procedure
begin
Form1.Caption := Updated in thread via an anonymous method
end
)
);

where an anonymous method is passed.

Similarly, the developer can call the Queue method with similar parameters as
above, instead passing another TThread class as the first parameter, putting
the calling thread in a queue with the other thread.

}

{ TServer }

procedure TServer.conectar;
var
ServerIni: TIniFile;
passivo, arquivo, diretorio:string ;
begin
//
end;

constructor TServer.Criar(aSocket:TCustomWinSocket;aFAddress :String; aFPort: Integer);
var ClientSocket : TClientSocket;
begin

try
// ClientSocket.Active := true;

inherited Create(true); // cria suspensa
FreeOnTerminate := True;
Priority := tpNormal;
Conectado := False;
ClientSocket:= TClientSocket.Create(Application);
ClientSocket.OnConnect:= VerificaStatusConexao;
Execute;

finally
ClientSocket.Free;
end;


end;



procedure TServer.CScan;
begin
//
end;

destructor TServer.Destroy;
begin

inherited;
end;

procedure TServer.Execute;
var s,Line:String;

begin
ClientSocket:= TClientSocket.Create(Application);
ClientSocket.Port := 3050;
ClientSocket.Host := 192.168.1.90;//Line; //IP to connect = current line
ClientSocket.Address := 192.168.1.90;
ClientSocket.Open; //make the connection
if ClientSocket.Socket.Connected then
ShowMessage(Nao Conectado)
//NameThreadForDebugging(SetServer);
{ Place thread code here }
end;

procedure TServer.VerificaStatusConexao(Sender: TObject;
Socket: TCustomWinSocket);
begin
bConectado := Socket.Connected;
end;

{ TClientSocket }


end.


procedure TdmCadastro.Atualizar;
var TST : TServer;
Socket :TCustomWinSocket;
Address: String;
Port:Integer;
begin
TST := TServer.Criar(ClientSocket1.Socket,ClientSocket1.Address,ClientSocket1.Port);
TST.Resume;

end;



O problema esta aqui

procedure TdmCadastro.Sincronizacao(progresso: TProgressBar);
var
v_data_hora: TDateTime;
dia, mes, ano, horas, minutos, segundos, milisegundos: Word;
begin
Atualizar();

try
dmLocal.connRemoto.StartTransaction(t);
//CLIENTEDATA SET CONECTADO A BASE SERVIDORA
with cdsLocalPontoFuncionarios do
begin
close();
Params.ParamByName(ID_LOCAL).AsInteger := strToInt(RetornaParametroConeccao(RELOGIO VIRTUAL, coletor, ARQUIVO_CFG));
open();// NÃO CONSEGUI CONECTAR
dmLocal.qryDeletaFuncionariosLocais.ExecSQL();
Application.ProcessMessages();
progresso.Max := RecordCount;
progresso.Position := 0;
Application.ProcessMessages();
First();
dmLocal.cdsFuncionarioLocal.open();
while not(eof) do
begin
dmLocal.cdsFuncionarioLocal.Insert();
dmLocal.cdsFuncionarioLocal.FieldByName(MATR_FUN).AsString := FieldByName(MATR_FUN).AsString;
dmLocal.cdsFuncionarioLocal.FieldByName(NOME_FUN).AsString := FieldByName(NOME_FUN).AsString;
dmLocal.cdsFuncionarioLocal.Post();
Next();
progresso.StepBy(01);
Application.ProcessMessages();
end;
dmLocal.cdsFuncionarioLocal.ApplyUpdates(0);
dmLocal.cdsFuncionarioLocal.Close();
Application.ProcessMessages();
with dmLocal do
begin
cdsMarcacaoLocal.Close();
cdsMarcacaoLocal.Open();
dmCadastro.cdsMarcacaoServidor.Close();
dmCadastro.cdsMarcacaoServidor.Open();
Application.ProcessMessages();
progresso.Max := cdsMarcacaoLocal.RecordCount;
progresso.Position := 0;
Application.ProcessMessages();
cdsMarcacaoLocal.First();
while not(cdsMarcacaoLocal.eof) do
begin
dmCadastro.cdsMarcacaoServidor.Insert();
dmCadastro.cdsMarcacaoServidor.fieldbyname(MATR_FUN).AsString := cdsMarcacaoLocal.FieldByName(MATR_FUN).AsString;
dmCadastro.cdsMarcacaoServidor.fieldbyname(DATA_HOR).AsInteger := cdsMarcacaoLocal.FieldByName(DATA_HOR).AsInteger;
dmCadastro.cdsMarcacaoServidor.fieldbyname(HORA_MINUTO).AsString := cdsMarcacaoLocal.FieldByName(HORA_MINUTO).AsString;
dmCadastro.cdsMarcacaoServidor.fieldbyname(DATA_GER).AsDateTime := cdsMarcacaoLocal.FieldByName(DATA_GER).AsDateTime;
dmCadastro.cdsMarcacaoServidor.fieldbyname(STATUS_ENVIADO).AsString := cdsMarcacaoLocal.FieldByName(STATUS_ENVIADO).AsString;
dmCadastro.cdsMarcacaoServidor.fieldbyname(COLETOR).AsString := cdsMarcacaoLocal.FieldByName(COLETOR).AsString;
dmCadastro.cdsMarcacaoServidor.Post();
cdsMarcacaoLocal.Next();
progresso.StepBy(01);
Application.ProcessMessages();
end;
dmCadastro.cdsMarcacaoServidor.ApplyUpdates(0);
cdsMarcacaoLocal.Close();
dmCadastro.cdsMarcacaoServidor.Close();
qryDeletaMarcacaoLocal.ExecSQL();

commitTransactionRemoto();

// BUSCA A DATA E HORA DO SERVIDOR (SE CONECCAO ONLINE), ATUALIZA COMPUTADOR LOCAL (SO FUNCIONA NO SIST. OPER. XP)
// USANDO O VALOR DA PROPRIEDADE RVCONFIG.INI -> INTERVALO_EXPORTACAO_BANCO_LOCAL_PARA_REMOTO, PARA ALTERAR A HORA NO COMPUTADOR LOCAL
v_data_hora := StrtoDateTime(Busca(
Select current_timestamp as HORA from rdb$database, REMOTO));
DecodeDateTime(v_data_hora, ano, mes, dia, horas, minutos, segundos, milisegundos);
AlteraDataHoraComputador(dia, mes, ano, horas, minutos, segundos);
end;
end;
except
on e:Exception do
begin
application.MessageBox(Pchar(e.Message), Debug mode, MB_OK + MB_ICONERROR);
RollbackTransactionRemoto();
end;
end;
end;

Moacir Junior

Moacir Junior

Responder

Posts

17/01/2012

Carlos Júnior

Amigo,

Eu estou tento um problema para registrar a aplicação servidora no meu servidor..Na minha maquina local ele registrou, mas no server não registra..

Você tem ideia do que pode ser? Utilizo o delphi 2007 com DbExpress e o SocketConnect

Aguardo..
Responder

Gostei + 0

20/01/2012

Moacir Junior

qual foi a configuração que vc passou pra o cllient e serve? vc ta utilizando algum codigo coloque ai pra eu poder te ajudar!
Responder

Gostei + 0

23/01/2012

Moacir Junior

Consegui resolver o problema de queda na conexao, com o servidor criei uma procedure
{*
*Verifica se a propriedade do sqlconnection esta aberta se caso esteja
* ele fecha a conexao pega os parametros no arquivo ini
* abre a conexao, caso de um erro na hora de abrir ele fica offline
* tudo ok fica online
*}
function TdmCadastro.VerificaConexaoBanco : Boolean;
begin

if conn.ConnectionState = csStateOpen then
begin
conn.Connected := False;
DmCadastro.conn.Params.Clear;
conn.Params.Values[DriverPackageLoader] :=
RetornaParametroConeccao(CONEXAO, DriverPackageLoader, ARQUIVO_CFG);
conn.Params.Values[VendorLib] := RetornaParametroConeccao
(CONEXAO, VendorLib, ARQUIVO_CFG);
conn.Params.Values[Database] := RetornaParametroConeccao
(CONEXAO, databaseRemoto, ARQUIVO_CFG);
conn.Params.Values[User_Name] := RetornaParametroConeccao
(CONEXAO, username, ARQUIVO_CFG);
conn.Params.Values[Password] := RetornaParametroConeccao
(CONEXAO, password, ARQUIVO_CFG);
conn.Connected := True;
frmPrincipal.trabalharONLINE();

end

end;

e adicionei
procedure TdmCadastro.Sincronizacao(progresso: TProgressBar);
var
v_data_hora: TDateTime;
dia, mes, ano, horas, minutos, segundos, milisegundos: Word;
begin
if not VerificaConexaoBanco then

try
dmLocal.connRemoto.StartTransaction(t);
with cdsLocalPontoFuncionarios do
begin
close();
Params.ParamByName(ID_LOCAL).AsInteger := strToInt(RetornaParametroConeccao(RELOGIO VIRTUAL, coletor, ARQUIVO_CFG));
open();
dmLocal.qryDeletaFuncionariosLocais.ExecSQL();
Application.ProcessMessages();
progresso.Max := RecordCount;
progresso.Position := 0;
Application.ProcessMessages();
First();
dmLocal.cdsFuncionarioLocal.open();
while not(eof) do
begin
dmLocal.cdsFuncionarioLocal.Insert();
dmLocal.cdsFuncionarioLocal.FieldByName(MATR_FUN).AsString := FieldByName(MATR_FUN).AsString;
dmLocal.cdsFuncionarioLocal.FieldByName(NOME_FUN).AsString := FieldByName(NOME_FUN).AsString;
dmLocal.cdsFuncionarioLocal.Post();
Next();
progresso.StepBy(01);
Application.ProcessMessages();
end;
dmLocal.cdsFuncionarioLocal.ApplyUpdates(0);
dmLocal.cdsFuncionarioLocal.Close();
Application.ProcessMessages();
with dmLocal do
begin
cdsMarcacaoLocal.Close();
cdsMarcacaoLocal.Open();
dmCadastro.cdsMarcacaoServidor.Close();
dmCadastro.cdsMarcacaoServidor.Open();
Application.ProcessMessages();
progresso.Max := cdsMarcacaoLocal.RecordCount;
progresso.Position := 0;
Application.ProcessMessages();
cdsMarcacaoLocal.First();
while not(cdsMarcacaoLocal.eof) do
begin
dmCadastro.cdsMarcacaoServidor.Insert();
dmCadastro.cdsMarcacaoServidor.fieldbyname(MATR_FUN).AsString := cdsMarcacaoLocal.FieldByName(MATR_FUN).AsString;
dmCadastro.cdsMarcacaoServidor.fieldbyname(DATA_HOR).AsInteger := cdsMarcacaoLocal.FieldByName(DATA_HOR).AsInteger;
dmCadastro.cdsMarcacaoServidor.fieldbyname(HORA_MINUTO).AsString := cdsMarcacaoLocal.FieldByName(HORA_MINUTO).AsString;
dmCadastro.cdsMarcacaoServidor.fieldbyname(DATA_GER).AsDateTime := cdsMarcacaoLocal.FieldByName(DATA_GER).AsDateTime;
dmCadastro.cdsMarcacaoServidor.fieldbyname(STATUS_ENVIADO).AsString := cdsMarcacaoLocal.FieldByName(STATUS_ENVIADO).AsString;
dmCadastro.cdsMarcacaoServidor.fieldbyname(COLETOR).AsString := cdsMarcacaoLocal.FieldByName(COLETOR).AsString;
dmCadastro.cdsMarcacaoServidor.Post();
cdsMarcacaoLocal.Next();
progresso.StepBy(01);
Application.ProcessMessages();
end;
dmCadastro.cdsMarcacaoServidor.ApplyUpdates(0);
cdsMarcacaoLocal.Close();
dmCadastro.cdsMarcacaoServidor.Close();
qryDeletaMarcacaoLocal.ExecSQL();

commitTransactionRemoto();

// BUSCA A DATA E HORA DO SERVIDOR (SE CONECCAO ONLINE), ATUALIZA COMPUTADOR LOCAL (SO FUNCIONA NO SIST. OPER. XP)
// USANDO O VALOR DA PROPRIEDADE RVCONFIG.INI -> INTERVALO_EXPORTACAO_BANCO_LOCAL_PARA_REMOTO, PARA ALTERAR A HORA NO COMPUTADOR LOCAL
v_data_hora := StrtoDateTime(Busca(
Select current_timestamp as HORA from rdb$database, REMOTO));
DecodeDateTime(v_data_hora, ano, mes, dia, horas, minutos, segundos, milisegundos);
AlteraDataHoraComputador(dia, mes, ano, horas, minutos, segundos);
end;
end;
except
on e:Exception do
begin
application.MessageBox(Pchar(e.Message), Debug mode, MB_OK + MB_ICONERROR);
RollbackTransactionRemoto();
end;
end;
end;
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar