Ir para conteúdo
Fórum Script Brasil
  • 0

Clientsocket


Guest - Uil -

Pergunta

dry.gif Seguinte estou tendo problemas na recepcao dos dados do servidor, leio os registros no servidor e envio um a um para o cliente que solicitou, mas o cliente as vezes não recebe todos (total 68) os registros do servidor, é aleatorio, as vezes recebe todos e as vezes não, e quando falta registros nem sempre são os mesmo que faltam. Vou mandar o codigo para analizar:

>>>>> Servidor <<<<<<

procedure TFServer.ServerSocket1ClientRead(Sender: TObject;

Socket: TCustomWinSocket);

Begin

While not xSQL.Eof do

Begin

Mensagem:='00001'+xSQL.FieldByName('NOME').AsString + ';' +

xSQL.FieldByName('EMPRESA').AsString + ';' +

xSQL.FieldByName('CODIGOINTERNO').AsString + ';';

if Socket.Connected then

ServerSocket1.Socket.Connections[0].SendText(Mensagem);

xSQL.Next;

End;

end;

>>>>> Cliente <<<<<

procedure TFPrincipal.ClientSocket1Read(Sender: TObject;

Socket: TCustomWinSocket);

Var

Posicao : Integer;

Texto : String;

begin

Texto:=ClientSocket1.Socket.ReceiveText;

if Copy(Texto,1,5) = '00008' then

Begin

FMovimento.cdsMvto.Append;

Delete(Texto,1,5);

Posicao:=Pos(';',Texto);

FMovimento.cdsMvtoNOME.AsString:=Copy(Texto,1,Posicao-1);

Delete(Texto,1,Posicao);

Posicao:=Pos(';',Texto);

FMovimento.cdsMvtoEMPRESA.AsString:=Copy(Texto,1,Posicao-1);

Delete(Texto,1,Posicao);

Posicao:=Pos(';',Texto);

FMovimento.cdsMvtoCODIGO.AsString:=Copy(Texto,1,Posicao-1);

FMovimento.cdsMvto.Post;

end;

end

O que esta de errado ai ???? abracos ... espero que me ajundem wink.gif

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Acho que o ideal seria ter um tipo de confirmação emitida pelo cliente para que o servidor possa enviar o próximo registro. Ou seja, o servidor enviaria o primeiro registro para o cliente e não enviaria o segundo enquanto o cliente não respondesse que recebeu o primeiro, e assim por diante. Talvez assim você possa minimizar erros desse tipo.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

bem eu imaginava essa resposta, mais não estou conseguindo obter o controle dos recebimentos do cliente para enviar uma resposta para o servidor, acho que por estar dentro de um loop os envios do servidor.

já tentei varias formar de montar uma logica para o processamento controlado ...

Mais pesquisando sobre o assunto surgiu mais uma duvida ... a perda dos dados poder esta em outra questao...

por exemplo o cliente fica a espera de mensagens enviadas na porta certo? bem sera que o windows não envia algum tipo de sinal nesta porta e quando isto ocorre, este sinal toma lugar dos meus dados? se for isso eu teria que fazer com que essa porta so receba informacoes que eu mande.

O que me diz? tdo bobagem que eu felei :-(

Abraços e desculpa minha ignorancia ... hehe

Link para o comentário
Compartilhar em outros sites

  • 0

bem eu imaginava essa resposta, mais não estou conseguindo obter o controle dos recebimentos do cliente para enviar uma resposta para o servidor, acho que por estar dentro de um loop os envios do servidor.

já tentei varias formar de montar uma logica para o processamento controlado ...

Sim, vai ser necessário estruturar o envio e o recebimento de maneiras diferentes das quais você está utilizando agora. De qualquer maneira, acredito que você ainda possa aproveitar esse seu método, apenas fazendo uma pausa entre um envio e outro (dentro do loop), até que o cliente responda.

Mais pesquisando sobre o assunto surgiu mais uma duvida ... a perda dos dados poder esta em outra questao...

por exemplo o cliente fica a espera de mensagens enviadas na porta certo? bem sera que o windows não envia algum tipo de sinal nesta porta e quando isto ocorre, este sinal toma lugar dos meus dados? se for isso eu teria que fazer com que essa porta so receba informacoes que eu mande.

Humm... até onde sei, isso não ocorre. O que talvez possa acontecer é haver um limite para a quantidade de dados recebidos (um buffer), e que o mesmo esteja sendo ultrapassado (mais informações enviadas do que lidas). Mesmo assim, acho difícil que isso pudesse acontecer.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Só uma sugestão: Quando vários Clients solicitam ao Server, este não pode estar síncrono com os Clients. Imagine que um Client desconecte durante uma transmissão; o Server ficará na espera deste Client indefinidamente, comprometendo assim os outros. Em outras palavras, os Clients devem ser sempre síncronos com o Servidor, mas o Servidor deve ser sempre assíncrono com os Clients.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...