ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Thread não recebendo SendText na parte Servidor.

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
llgghhe
Novato
Novato


Registrado: Terça-Feira, 30 de Dezembro de 2014
Mensagens: 14

MensagemEnviada: Ter Dez 30, 2014 3:48 pm    Assunto: Thread não recebendo SendText na parte Servidor. Responder com Citação

Boa tarde pessoal,

estou com um problema aqui pra fazer o upload de arquivo via Sockets e me encontro no seguinte cenário:

Aplicação Cliente (a que recebe o arquivo enviado) =>

Código:


var
Tamanho: Integer;
Recebendo: Boolean;
nome: string;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
dados: string;

begin
dados := Socket.ReceiveText;

//============== EDIT1 RECEBE O CAMINHO ONDE SERÁ SALVO O ARQUIVO UPADO ===============
if Copy(dados,1,6)='<up>' then
Begin
Delete(dados, 1, 6) ;
button1.Click;
Edit1.Text:= dados;
nome:= dados;
exit;
end;
//=====================================================================================


//=====================================================
//                                                     |
// BOTÃO ENVIANDO STRING '<Arquivo>' PARA A THREAD   |
// QUE FAZ ENVIO DO STREAM COM O ARQUIVO DE UPLOAD     |
//                                                     |
//=====================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket3.Socket.SendText('<Arquivo>');
end;
//======================================================

//======================================================
//                                                      |
// AQUI É ONDE O ARQUIVO UPADO PELO SERVIDOR É RECEBIDO |
// E SALVO NO DIRETORIO DEFINIDO NO EDIT1               |
//                                                      |
//======================================================
procedure TForm1.ClientSocket3Read(Sender: TObject;
  Socket: TCustomWinSocket);

var
 Stream: TMemoryStream;
  s: string;
begin
  s := Socket.ReceiveText;

  if Recebendo = False then begin
    if Pos(#0, s)>0 then begin

      Tamanho := StrToInt(Copy(s, 1, Pos(#0, s)-1));
      Delete(s, 1, Pos(#0, s));
      Stream := TMemoryStream.Create;
      Pb1.Max := tamanho;
      Recebendo := true;
    end;
  end;
  try
    Stream.Write(s[1], Length(s));
    PB1.Position := Stream.Size;

    if Stream.Size >= Tamanho then begin
      Stream.Position := 0;

     if nome = edit1.Text then begin
        Stream.SaveToFile(nome);
        Application.MessageBox('Salvo com sucesso!', 'Aviso', 64);
     end;
      Recebendo := false;
      Stream.Free;
end;
  except
    Stream.Free;
    Recebendo := false;
  end;
//=============================================================

end;


Aplicação Servidor (a que envia o arquivo para o cliente) =>

Código:


type
  TServ_Sock3 = class(TThread)
    private
      procedure Execute; override;
    public
      Socket: TCustomWinSocket;
end;

var
caminho: string;

procedure TForm1.EnviarArquivo1Click(Sender: TObject);
begin

 If not Assigned(LV.Selected) then exit;
if LV.Selected.Checked = false then exit;

  if OpenDialog1.Execute then begin
  caminho:= opendialog1.FileName;  // C:\arquivo a ser enviado.txt
 
  SS.Active:= true;
  SS2.Socket.Connections[Form1.LV.ItemIndex].SendText('<up>'+caminho);

end;
end;
//======================================================

//======================================================
//                                                      |
//    AQUI QUE É O GRANDE PROBLEMA, O ClientSocket3     |
//    na parte Cliente deste projeto, envia a string    |
//    '<Arquivo>', mas essa execução de               |
//    Thread não recebe e não consegue enviar o arquivo |
//                                                      |
//=====================================================
procedure TServ_Sock3.Execute;
var
  s: String;
  Stream: TMemoryStream;
begin
  inherited;

  while not Terminated and Socket.Connected do begin
    if Socket.ReceiveLength>0 then begin
      s := Socket.ReceiveText;

      if Pos('<Arquivo>', s)>0 then begin

          Stream := TMemoryStream.Create;

           Stream.LoadFromFile(caminho);

          Stream.Position := 0;
          Socket.SendText(IntToStr(Stream.Size)+#0);
          Sleep(1000);
          Socket.SendStream(Stream);
        end;
      end;

    end;
    Sleep(10);
end;
//========================================================

//===========================================================
//                                                           |
//  PARTE ONDE CHAMA A EXECUÇÃO DA TRHEAD QUE FAZ O UPLOAD   |
//   DE ARQUIVO                                              |
//                                                           |
//===========================================================
procedure TForm1.SSAccept(Sender: TObject; Socket: TCustomWinSocket);
var
  Conex: TServ_Sock3;
begin
  Conex := TServ_Sock3.Create(true);
  Conex.Socket := Socket;
  Conex.FreeOnTerminate := True;
  Conex.Resume;

end;
//============================================================


Não faço a menor ideia do que possa estar acontecendo, o único problema é o texto enviado a partir do ClientSocket3, presente na parte cliente da aplicação, que não é recebido pela Thread (na parte servidor) que envia o arquivo para o ClientSocket3Read, presente na parte cliente.

Alguém por favor, poderia me ajudar?

Agradeço a todos.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Sáb Jan 03, 2015 9:39 am    Assunto: Responder com Citação

ta usando nonblocking? vc tem q implementar o envento read do socketServerCli. desse jeito ai não rola
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Sáb Jan 03, 2015 9:41 am    Assunto: Responder com Citação

tem como vc zipar o exemplo e me mandar por mail?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
llgghhe
Novato
Novato


Registrado: Terça-Feira, 30 de Dezembro de 2014
Mensagens: 14

MensagemEnviada: Seg Jan 05, 2015 10:18 am    Assunto: Responder com Citação

gilsonnrodrigues escreveu:
tem como vc zipar o exemplo e me mandar por mail?



Caro Gilson, agradeço demais pela atenção à minha dúvida, mas já consegui resolver o problema. Esqueci de atribuir uma porta (msm porta do ClientSocket3) ao ServerSocket3, e também dei uma modificada na Thread, veja abaixo:

Código:


type
  TServ_Sock3 = class(TThread)
    private
    Socket: TCustomWinSocket;
    public
     constructor Create(aSocket: TCustomWinSocket);
    procedure Execute; override;

end;

Constructor TServ_Sock3.Create(aSocket: TCustomWinSocket);
begin
  inherited Create(true);
  Socket := aSocket;
  FreeOnTerminate := true; //aqui vai libera-la
end;


procedure TForm1.ServerSocket3Accept(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Conex: TServ_Sock3;
begin {
  Conex := TServ_Sock3.Create(true);
  Conex.Socket := Socket;
  Conex.FreeOnTerminate := True;
  Conex.Resume; }
  Conex := TServ_Sock3.Create(Socket);
  Conex.Resume;
end;

[/code]
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB