PDA

Ver la Versión Completa : TTcpClient y TTcpServer


b3nshi
25-08-2007, 02:01:07
Mi pregunta creo q dentro de todo es sencilla... quisiera saber si puedo hacer un chat en red con estos componentes... vi un ejemplo en la web de Seoane para enviar un fichero, la pregunta es como seria en red? Es exactamente lo mismo pero con una IP de la red verdad?

Y si hay alguien q me pueda explicar como es q se envia un fichero... porq por ejemplo a esta porcion del codigo (del programa de seoane) no logro entenderla... Estuve leyendo un poco sobre la clase TFileStream, pero aun asi no termino de entender la idea de Buffer... alguien q me pueda explicar?



procedure TEnvio.Execute;
var
Buffer: PByte;
Leidos: Integer;
begin
inherited;
with TFileStream.Create(FLocalFile,fmOpenRead or fmShareDenyWrite) do
try
GetMem(Buffer,BufferSize);
try
FCliente.Active:= TRUE;
try
FCliente.Sendln(FRemoteFile);
Leidos:= Read(Buffer^,BufferSize);
while (Leidos > 0) and not Terminated do
begin
FCliente.SendBuf(Buffer^,Leidos);
Leidos:= Read(Buffer^,BufferSize);
end;
finally
FCliente.Active:= FALSE;
end;
finally
FreeMem(Buffer);
end;
finally
Free;
end;
end;


Muchas Gracias!

{Saludos}

MaMu
26-08-2007, 14:10:46
pero aun asi no termino de entender la idea de Buffer... alguien q me pueda explicar?

Muchas Gracias!

{Saludos}

Yo lo interpreto como un puntero al tamaño del archivo, mientras este es leido, es enviado, hasta que se termine de leer.

Saludos

b3nshi
26-08-2007, 16:18:41
Bien... digamos q lo q hago en el codigo es ir leyendo parte por parte el archivo, buffer contiene el tamaño del archivo, entonces en el leidos voy cargando por partes mi archivo? Asi seria?

Por ejemplo yo puedo hacer algo asi?


var
archivo: FILE of byte;
contenido, enviando : ansistring;
tam, i, tamenvio : integer;
begin
{Archivo Basico}
try
AssignFile(archivo, "miarchivo.ext");
Reset(archivo); // intentar abrirlo
Except On Exception do
begin
try
{Error: el archivo no existe o esta en uso}
exit;
end;
end;
end;

{Creo el componente para el envio y bueno... se lo configura}
cliente:= TTCPClient.Create(nil);
...

{Ahora voy leyendo por parte}
tam := strlen(archivo);
seek(archivo,0);
read(archivo, contenido); //Aqui cargo todo el archivo
closefile(archivo); //Ya no lo necesito

for i := 0 to tam do //Recorro la variable contenido hasta el final
begin
if (i + tamenvio) < tam then
begin
enviando := copy(contenido, i, tamenvio);
end
else
begin
enviando := copy(contenido, i, tam - i);
end;
cliente.sendln(enviando);//Envio por parte el archivo
i := i + tamenvio; //Incremento la variable
end;
end;


Bueno supongo q algo mal tiene q haber en el codigo pero lo escribi de memoria... ahora mi pregunta es... puedo hacerlo de esta forma?

No se si se entendio pero la idea de esta forma es ir leyendo el archivo en partes como si fuera cadena de texto y la pc q lo reciba va a tener q ir armandolo al archivo en partes tambien...

Si es asi cuales son las ventajas y desventajas de hacerlo de esta forma?

Muchas Gracias por tu respuesta :D
{Saludos}

MaMu
27-08-2007, 04:19:14
La verdad es que podria haber muchas, pero siempre depende de que trate la aplicacion. Un verdadera ventaja, desde mi punto de vista, es muy comodo para usar un progressbar e informar del envio. El hecho de enviarlo por partes me parece lo mejor, sobre todo para volumenes de datos muy grandes (no exesivos).
Y por sobre todas las cosas, porque es codigo de Seoane, y la verdad que todo lo que el ha publicado, es claro, completo, y siempre funciona :D.

Saludos

b3nshi
27-08-2007, 18:48:46
Buen punto no? Eso de seoane es verdad... sus codigos son muy buenos y efectivos...

Y ahora otra pregunta... digamos q continuando con este tema... si yo por ejemplo quiero crear una aplicacion en red, con una base de datos en el servidor no mas, pero esa base de datos va a ser un XML, como puedo hacer para compartirlo? Tendria q enviarlo al cliente cada vez q este lo quiera utilizar?

Muchisimas Gracias!

{Saludos}

MaMu
28-08-2007, 03:20:51
Todo depende de que es lo que sea tu aplicación, que motor de base de datos vas a usar? de que trata la aplicacion?

Saludos

b3nshi
29-08-2007, 22:34:03
Perdon por la demora en contestar... estuve estudiando mucho rindo una materia libre dentro de 2 dias y bueno... toy medio preocupado...

En cuanto a mi aplicacion, es para sacar turnos, para un taller, digamos q no voy a utilizar un motor de base de datos, solo voy a utilizar un XML, q voy a manejarlo con TXmlDocument, se entiende?

Por eso si yo quiero hacer una consula desde otra pc, o por ejemplo quiero ver todos los turnos disponibles y los turnos ya dados, como podria hacerlo?

Tendria q enviarme el archivo cada vez q quiera ver todo y cuando quiera consultar por un solo horario seria una consulta enviando por ejemplo: "componente.sendln(consulta)" y q el servidor me devuelva una cadena de texto con la info?

Muchas Gracias!

{Saludos}