Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-06-2004
Avatar de Sr_Sombrero
Sr_Sombrero Sr_Sombrero is offline
Miembro
 
Registrado: may 2003
Posts: 49
Poder: 0
Sr_Sombrero Va por buen camino
Enviar archivo por socket. 'TStream' y 'TFileStream' Incompatibles.

Estoy tratando de transferir un archivo a través de una conexión por socket.

Programo una "Console Application" por lo que no puedo recurrir a los componentes sockets que trae Delphi, así que uso una Librería WinSock que funciona casi igual que los TServerSocket y TClientSocket.

El problema surge cuando quiero enviar un archivo usando un código similar a este:

Código:
ClientSocket2.Socket.SendStream (TFileStream.Create (strFile, fmOpenRead or fmShareDenyWrite));
Esto funciona en los componentes sockets que trae Delphi, pero en el caso de la librería que uso me da el siguiente error al compilar:

"Incompatible types: 'TStream' and 'TFileStream'"

La primera solución que se me ocurre es (si se puede) transformar el TFileStream a TStream. ¿Cómo lo hago?

La segunda solución podría ser enviar el archivo de otra manera ¿SendBuffer serviría?

Gracias de antemano
Responder Con Cita
  #2  
Antiguo 29-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Sr_Sombrero
Programo una "Console Application" por lo que no puedo recurrir a los componentes sockets que trae Delphi
¿Y por qué no?

El hecho de que no dispongas de un formulario para insertar los componentes no te impide usarlos, es sólo que tienes que crearlos tú mismo, por ejemplo:

Código Delphi [-]
var
  Server: TServerSocket;

begin
  Server := TServerSocket.Create(nil);
end;

Y acordarte de destruirlos con

Código Delphi [-]
Server.Free;

// Saludos
Responder Con Cita
  #3  
Antiguo 29-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por Sr_Sombrero
Programo una "Console Application" por lo que no puedo recurrir a los componentes sockets que trae Delphi, así que uso una Librería WinSock que funciona casi igual que los TServerSocket y TClientSocket.
Ya te ha dicho román que si es posible, y creo que sería lo mejor (mejor si con las INDY, desde mi punto de vista).

Cita:
Empezado por Sr_Sombrero
Esto funciona en los componentes sockets que trae Delphi, pero en el caso de la librería que uso me da el siguiente error al compilar:

"Incompatible types: 'TStream' and 'TFileStream'"

La primera solución que se me ocurre es (si se puede) transformar el TFileStream a TStream. ¿Cómo lo hago?
Hola. Habría que ver la sentencia donde te da el error, y si es en una llamada a procedimiento o función, ver cómo está declarada. Lo cierto es que un TFileStream si es un TStream, puesto que deriva de él, por lo que no necesita de ninguna transformación para ser un TStream.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 29-06-2004
Avatar de Sr_Sombrero
Sr_Sombrero Sr_Sombrero is offline
Miembro
 
Registrado: may 2003
Posts: 49
Poder: 0
Sr_Sombrero Va por buen camino
Cita:
El hecho de que no dispongas de un formulario para insertar los componentes no te impide usarlos, es sólo que tienes que crearlos tú mismo.
Todos los días se aprende algo nuevo , de todos modos si puedo usar la librería que tengo es mejor porque pesa el 10% de las originales.


Cita:
Lo cierto es que un TFileStream si es un TStream
Si, eso lo investigue en el libro de Cantú, por eso no entinedo porque no anda.


Cita:
Habría que ver la sentencia donde te da el error, y si es en una llamada a procedimiento o función, ver cómo está declarada.
Voy a ver si puedo elaborar un poco más la pregunta.

¿y mandarlo como sendBuffer? ¿se puede?

Muchas gracias

Última edición por Sr_Sombrero fecha: 29-06-2004 a las 21:30:46.
Responder Con Cita
  #5  
Antiguo 29-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por Sr_Sombrero
¿y mandarlo como sendBuffer? ¿se puede?
Depende del tamaño del archivo, pues tenes que subirlo todo a memoria y tenerlo en un vector o estructura similar. Tanto para enviarlo como para recibirlo.

Algo como:

Código Delphi [-]
Var
  archivo: Array[1..1048576] of byte; {archivo de 1 Mb}

Begin
  // lee primero el archivo al arreglo y luego:
  ObjetoOLibreria.SendBuffer(archivo[0], length(archivo));
end;

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 30-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Por cierto, aunque decidas no usar las componentes mencionadas, te comento que no sólo puedes usarlas en una aplicación de consola cómo te dije, sino que además puedes agregar un DataModule a tu proyecto en donde sí puedes colocar las componentes como si de un Form se tratara y modificar sus propiedades en el inspector de objetos.

// Saludos
Responder Con Cita
  #7  
Antiguo 01-07-2004
Avatar de Sr_Sombrero
Sr_Sombrero Sr_Sombrero is offline
Miembro
 
Registrado: may 2003
Posts: 49
Poder: 0
Sr_Sombrero Va por buen camino
Finalmente encontré este código para enviar y recibir archivos como buffer.
Lo copio para futuras consultas
Sacado de una página que ya no existe (delphi.owns.it).

Código Delphi [-]
procedure TClientSocket.ReceiveFile(FileName: string);
var
  Data: string;
  Buffer: pchar;
  BinaryFile: file of char;
  BinaryFileSize, BytesRead: integer;
begin
  Idle(0);
  Data := ReceiveString;
  BinaryFileSize := StrToInt(Data);
  Idle(0);
  AssignFile(BinaryFile, FileName);
  ReWrite(BinaryFile);
  while FileSize(BinaryFile) < BinaryFileSize do
  begin
    Sleep(1);
    BytesRead := ReceiveLength;
    if BytesRead > 0 then
    begin
      GetMem(Buffer, BytesRead);
      try
        ReceiveBuffer(Buffer^, BytesRead);
        BlockWrite(BinaryFile, Buffer^, BytesRead);
      finally
        FreeMem(Buffer);
      end;
    end;
  end;
  CloseFile(BinaryFile);
end;

procedure TClientSocket.SendFile(FileName: string);
var
  BinaryFileSize, BytesRead: integer;
  Buffer: pchar;
  BinaryFile: file of char;
  BinaryFileHandle: THandle;
begin
  BinaryFileHandle := CreateFile(pchar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_NO_BUFFERING, 0);
  BinaryFileSize := GetFileSize(BinaryFileHandle, nil);
  CloseHandle(BinaryFileHandle);
  AssignFile(BinaryFile, FileName);
  Reset(BinaryFile);
  SendString(inttostr(BinaryFileSize));
  Sleep(500);
  repeat
    Sleep(1);
    GetMem(Buffer, 2048);
    try
      BlockRead(BinaryFile, Buffer^, 2048, BytesRead);
      SendBuffer(Buffer^, BytesRead);
    finally
      FreeMem(Buffer);
    end;
  until BytesRead < 2048;
  CloseFile(BinaryFile);
end;

Saludos

Última edición por Sr_Sombrero fecha: 05-07-2004 a las 06:56:24.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 06:29:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi