Ir para conteúdo
  • Cadastre-se

dev botao

Acbrnfemonitor Com Multiplas Conexões Usando Por Socket


andersonscinfo
  • Este tópico foi criado há 3430 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa noite pessoal, antes de mais nada quero dizer que ja garimpei no forum e de fato encontrei diversas discuções mas o estranho é que não foram resolvidas, meu problema é o seguinte, quando tenho duas estações enviando comandos para o monitor ex: um enviando crianfe e outro envianfe, se o envianfe esta em execução ele trava o crianfe oque na verdade não deveria acontecer, eu fiz varias alterações no codigo da minha aplicação para tentar reverter essa alteração, mas sempre cai nesse mesmo problema, tentei enviar o comando e esperar uns segundos pra dai buscar o retorno, mas mesmo assim não funcionou, então queria pedir se possivel alguem tem isso funcionando pudesse me dar uma dica de como fazer, uso a ultima versão compilada do acbrnfemonitor de ontem, e meu software é em lazarus.

 

Att.

Anderson Junior

Link para o comentário
Compartilhar em outros sites

Bom dia, obrigado por responder André, antes de mais nada gostaria dizer que fiz o outro topico porque achei que como sou usuario sac, o tópico teria prioridade por la, peço desculpa pelo transtorno, agora vamos ao caso, eu analisei o log, e não encontrei, nada de anormal, mas segue o mesmo m anexo, uma observação que fiz ontem em testes, debugando a conexão com o monitor foi que, se eu mando de uma aplicação, o comando envianfe(), então ele inicia o envio, como sempre demora um pouco o retorno, se outra estação tenta dar um comado como crianfe, e a outra estação esta esperando o retorno do envianfe() ai entra o problema, ela fica eternamente esperando o retorno, enquanto a crianfe continua livre, uma outra coisa que notei foi que la no acbr não acontece a desconexão, ela fica com a conexão da primeira aberta.

 

Att.

Anderson Junior

LOG.TXT

Link para o comentário
Compartilhar em outros sites

Tentei de duas formas, vou postar as duas a baixo:

 

1 -

procedure TACBRMonitorNFeClienteTThread.Execute;
var
  B: byte = 0;
  S: string = '';
  SS: string = '';
begin
  Synchronize(@ShowWaitForm);
  try
    with TInetSocket.Create(FIp, StrToIntDef(FPorta, 0)) do
      try

        // ler head do ACBRMonitorNFe
        B := 0;
        repeat
          B := ReadByte;
          if B = 3 then
            Break;
        until False;

        FMensagem += LineEnding + '.' + LineEnding;

        // envia comando para ACBRMonitorNFe
        Write(Pointer(FMensagem)^, Length(FMensagem));


        // ler retorno do ACBRMonitorNFe
        B := 0;
        repeat
          B := ReadByte;
          if B = 3 then
            Break;
          S += Chr(;
        until False;


        if Assigned(FRetorno) then
          FRetorno(Self, AnsiToUtf8(S));
      finally
        Synchronize(@CloseWaitForm);
        Free;
      end;
  except
    on E: Exception do
    begin
      Synchronize(@CloseWaitForm);
      if Assigned(FRetorno) then
        FRetorno(Self, Format('Verifique a conexão com ACBRMonitorNFe: %s',
          [E.Message]));
    end;
  end;

end; 

2 - Na segunda forma eu apenas separei o envio da leitura, mas continuando na mesma conexão

 

envio

Var
  VCom, VEncerra: String;
begin
  try
    VEncerra:=AEncerra;

    Fsk:=TInetSocketUt.Create(FIP, StrToIntDef(FPorta, 0));
    VCom:=comando aqui'+AEncerra;

    repeat
      if Fsk.ReadByte = 3 then
        Break;
    until False;

    Fsk.Write(Pointer(VCom)^, Length(VCom));
    //processa leitura interna
    InternalRet;
  Except
    on E: Exception do
    begin
      if Assigned(FRetorno) then
        FRetorno(Self, 'Não foi possivel conectar-se ao monitor de '+
        'NF-e mensagem: '+#13+E.Message);
      InternalFreeFsk;
    end;
  end;

leitura

  try

    B := 0;
    FMsg:=EmptyStr;
    repeat
      B := FSocket.ReadByte;
      if (B = 3) or (Terminated) or (FSocket.LastError <> 0) or FSocket.Closing then
        Break;
      FMsg += Chr(;
    until False;


    if Assigned(FRet) then
      FRet(Self, AnsiToUtf8(FMsg));
  except
    on E: Exception do
    begin

      if Assigned(FRet) then
        FRet(Self, Format('Ocorreu um erro na leitura dos dados : '+#13+'%s',
          [E.Message]));
    end;
  end;

Estas são as formas que tentei....

 

Att.

Anderson Junior

Link para o comentário
Compartilhar em outros sites

  • Moderadores

A cada comando vc cria uma nova conexão?

TInetSocket.Create(FIp, StrToIntDef(FPorta, 0)) 
Já tentou deixar a conexão aberta durante toda execução do programa?
djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.lambretinha.com.br
Link para o comentário
Compartilhar em outros sites

Isso André, a cada comando crio uma nova conexão, se vou criar uma nfe, abro a conexão, se vou enviar uma nfe crio uma conexão, ainda não tentei fazer isso, deixar a conexão aberta enquanto o sistema estiver sendo executado, como não consegui monitorar esse tipo de conexão tipo se ta conectado ou não por isso achei melhor fazer dessa forma, mas agora acredito que é oque falta testar, vou fazer o teste, posto o resultado.

 

 

Att.

Anderson Junior

Link para o comentário
Compartilhar em outros sites

Boa tarde, tentei fazer como você me sugeriu, então aconteceu algo mais estranho ainda, pois o retorno da estação que estava enviando a nfe veio para a estação que estava criando a nfe, o retorno de uma veio para a outra, será que estou fazendo algo de errado, ja tentei colocar 2,3,4,5 ou 10 conexões simultaneas, mas acontece o mesmo comportamento em ambas....

 

 

Att.

Anderson Junior

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Não sei dizer, talvez o ACBrNFeMonitor não seja compatível com Threads, utilizo vários terminais conectando num mesmo ACBrNFeMonitor e nunca tive problemas como o relatado por você.

djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.lambretinha.com.br
Link para o comentário
Compartilhar em outros sites

Infelismente o problema não é a Thread, aconteceu a mesma coisa de antes, a mensagem de uma estação foi para a outra, ja regirei todo meu código e não encontrei nada que pudesse fazer tal influencia, até porque acredito que quem controla para qual conexão é enviado os retornos é o proprio Acbrnfemonitor, sem sofrer influencia da aplicação, se puder me dar mais alguma dica....fico agradecido...

 

Att.

Anderson Junior

Link para o comentário
Compartilhar em outros sites

Boa noite, estava usando o socket nativo do fcp (freepascal) a unica coisa que ainda não tinha alterado, então mudei para a synapse, em anexo vou colocar uma unit onde faço todo o processo, gostaria que alguem pudesse dar uma olhada, pra ver se estou fazendo algo errado, porque até o momento estou sem solução, ou é algo muito complicado ou tão facil que ainda não percebi...

 

Att.

Anderson Junior

uacbrnfemonitorcon.pas

Link para o comentário
Compartilhar em outros sites

Boa Noite, Anderson !

 

Desculpe pegar carona no seu tópico, mas programo em Harbour em tenho os mesmos problemas em TCP/IP Sockts.

Inclusive fiz vários testes com o Jorge Andrade aqui do forum e não conseguimos resolver.

Testes via Telnet, Terminal 1 enviando consulta contribuinte nfe.consultacadastro(),  e Terminal 2 consultando NFe destinadas ConsultaNFeDest(), na maioria das vezes quando não travava o retorno, retornava a resposta do Terminal 1 para o Terminal 2, e vice-versa !!!

 

 

Abraço.

Toninho Silva ( SysTux )

 

Link para o comentário
Compartilhar em outros sites

Boa noite Toninho, uma coisa te digo amigo, não é problema no código, o problema é com a forma que o indy gerencia as conexões, fiz tudo que é tipo de teste usando sockets do fpc, sockets do synapse e agora por ultimo sockets nativos em linux com (shell script) e detalhe, nada funcionou, então lavei minhas mãos, quando foi hoje percebi que no svn esta sendo alterado o indy pelo componente acbrsocketserver, então acho que pode ser que a solução vem por ai, acabei de atualizar o trunk e vou testar pra ver se ja ta funcional, qualquer coisa te aviso por aqui.

 

Att.

Anderson Junior

Link para o comentário
Compartilhar em outros sites

Boa noite novamente Toninho, testa com essa versão e me da um retorno por favor....

acabei de compilar, e testei com 2 conexões simultaneas, aparentemente funcionou legal, com mais de duas conexões não ficou bom, e nem com uma conexão vindo do windows e outra do linux, agora com duas conexões vindo de estações windows funcionou muito bem, faz um teste ai...

 

Att.

Anderson Junior

ACBrNFeMonitor.exe.rar

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3430 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.