PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Thread não recebendo SendText na parte Servidor. #505876

30/12/2014

0

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) =>


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) =>

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.
Luiz Eduardo

Luiz Eduardo

Responder

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

Aceitar