Visual Basic - Transferencia de archivos cliente - servidor

Life is soft - evento anual de software empresarial
 
Vista:

Transferencia de archivos cliente - servidor

Publicado por carlitro8 (9 intervenciones) el 27/06/2006 02:52:03
Buenas, mi problema es el siguiente: Estoy creando una aplicación en la que entre otras cosas, un programa cliente pide que se le envíe un archivo desde un programa servidor que está, obviamente, en otro pc. Lo tengo hecho de la siguiene manera: mediante el control WinSock, el cliente, que puede explorar el disco duro del ordenador servidor (creé un código para ello que funciona a la perfección), envía al servidor, al pulsar un botón, una cadena STRING que indica que indica al servidor que está pidiendo un archivo, seguido de la ruta en la que se encuentra el archivo que quiere q se le envíe, y seguido a continuacion del nombre del archivo con la extension correspondiente. Entonces en el servidor, cuando llega la informacion se desglosa y mete la ruta en "rutaarchivo" y el nombre en "nombrearchivo". Ahora el servidor abre el archivo en modo binario (Open rutaarchivo&nombrearchivo for binary as #1 ...(asi quedaria mas o menos) y seguidamente pongo esta línea de codigo : " contenido_archivo = Input(LOF(1), 1)" , ahora cierro el archivo (Close #1) y pongo esta linea de codigo : "tamaño_archivo = Len(contenido_archivo)". Ahora el servidor manda al cliente mediante el SendData la variable "tamaño_archivo" y el cliente la recibe y la mete en la variable "tamaño_archivo" pero de la aplicacion cliente. Seguidamente, el cliente vuelve a enviar una cadena al servidor para confirmar el envio del archivo, ya que el cliente ya posee todos los datos que le haran falta para recibir dicho archivo, y el servidor al recibirla ejecuta este codigo : "Winsock2.SendData contenido_archivo" con lo que esta enviando la variable "contenido_archivo". Por último, el cliente ejecuta lo siguiente en el arrivaldata del winsock correspondiente:
"Dim datos as string
If Len(archivo_temporal) <> tamaño_archivo Then
archivo_temporal = archivo_temporal + datos
Espera 500
If Len(archivo_temporal) = tamaño_archivo Then
On Error Resume Next
Open rutapclocal & nombrearchivo For Binary As #1
Put #1, 1, archivo_temporal
Espera 50
Close #1
archivo_temporal = ""
MsgBox ("Archivo recibido correctamente"), vbInformation
End If
End If
rutapclocal = ""
nombrearchivo = ""
End If"

(NO ESTÁ COPIADO TODO EL ARRIVALDATA, SOLO LO QUE INTERESA, ASI QUE NO SE PREOCUPEN POR SI HAY MAS IF QUE END IF Y COSAS ASI, SOLO DE LO REALMENTE IMPORTANTE DEL CODIGO :-) )

Por cierto, Espera (Milisegundos as Single) es una funcion definida para que el ordenador haga una pausa (un tiempo de espera, claro esta). Esto lo he puesto para intentar subsanar un poco más el problema q se me presenta (y que aun no he explicado :P) pero aun así, aunque me ha servido algo (muy poco) no he conseguido corregir el problema.

Bien, el problema realmente es el siguiente: con este codigo consigo que el servidor envie al cliente el archivo que el cliente pida, pero hasta ahora sol he conseguido que se transfieran archivos pequeños, el máximo fue de 560 KB, y eso cuando me ha ido mejor, a veces no me dejó ni eso. Con ponerle el tiempo de espera lo mejoré un poquito, pero no lo suficiente, ya que me gustaría que mínimo pueda enviar archivos de 5 MB o así, y he visto programas que lo hacen. No sé en qué fallo ni como corregirlo y hacerlo de forma que pueda pasar archivos más grandes sin problemas.

PD: desde el cliente exploro el pc servidor mediante un ListBox en el que me van apareciendo las carpetas y archivos del pc servidor bajo mis ordenes.Pues bien, cuando intento pasar un archivo mas grande de la cuenta, me aparecen al final del ListBox (como si fueran nuevos archivos) nuevos elementos que son letras muy raras y cosas asi. Suelen aparecer mas o menos de estos "elementos" de letras raras dependiendo de la capacidad del archivo que estoy intentando transferir.

Ojalá alguien sepa como ayudarme. Muchísimas gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Transferencia de archivos cliente - servidor

Publicado por Javi RM (187 intervenciones) el 27/06/2006 08:09:35
Buneas, tras leer tu post (muy completo por cierto), te recomiendo que en el protocolo de comunicaciones que has creado, almacenes el tamaño que debes recibir. Una vez conozcas el tamaño, debes esperar a recibir el total de los bytes indicados. No des por supuesto que lo recibiras todo en un tiempo determinado, sino que yo de tí realizaría un TimeOut bastante largo para la espera de un archivo.

Sigue la sigueinte logica:

Ya conoces el tamaño del archivo (TamArch) entonces ....

dim TOut as date
dim Datos as string
dim Buffer as string

Datos = ""
Buffer = ""
tout = dateadd("s",60,now)

do
doevents
Winsock2.GetData (buffer)
if len(buffer) > 0 then
Datos = Datos & buffer
end if
loop until len(datos) = TamArch or tout < now

if len(datos) <> tamArch then
msgbox "Error en recepción de archivo"
else
msgbox "Archivo OK"
end if

' Tienes el contenido del archivo en Datos a partir de aqui puedes manipular los datos.

Algo como lo anteriormente descrito tienes que ponerlo en la rutina de recepción de datos del socket.

Un saludo espero que te sirva de ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transferencia de archivos cliente - servidor

Publicado por carlitro8 (9 intervenciones) el 28/06/2006 01:09:26
Buenas, muchas gracias por contestar y por la ayuda.

Pero... o hago algo mal... o no se como hacerlo... pero esto no me termina de funcionar... jeje. Sería recomendable crear un Winsock nuevo para que realizara solo esta accion de enviar y recibir archivos? q me aconseja?¿ Pongo un Winsock3?

Gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transferencia de archivos cliente - servidor

Publicado por carlitro8 (9 intervenciones) el 28/06/2006 03:42:36
Buenas, he estado haciendo más pruebas, usando mi código (el primero q puse) He añadido en el cliente dos etiketas que me van mostrando una (label3) el tamaño total del archivo (es decir, label3.Caption = tamaño_archivo) y otra, label2, me va mostrando lo q va ocupando la variable "archivo_temporal" que es donde se van escribiendo los datos q van llegando. lo hago asi por si acaso (label2.Caption = Len(archivo_temporal)

La cosa es que me he dado cuenta de que cuando envio archivos pekeños en la label2 si termina apareciendo el mismo numero q en la label1, pero cuando envio archivos grandes en la label2 nunca llega a aparecer el mismo numero q en la label1, y para un mismo archivo siempre se para en el mismo numero (al menos las veces q lo he probado). Al no igualarse nunca, nunca se cumple q "tamaño_archivo = Len(archivo_temporal)" y por lo tanto nunca se ejecuta el If condicional q crea el archivo en el pc cliente y le mete los datos recibidos. A ver si alguien me puede ayudar, muchísimas gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transferencia de archivos cliente - servidor

Publicado por Jerónimo (49 intervenciones) el 09/07/2006 18:50:07
¿No te conviene dividir la la cadena en la cual ponés el contenido del archivo, en varias cadenas más pequeñas (por ejemplo, en un array) y mandar cadenas más pequeñas, que sí sabés que llegan?
Es solo una sugerencia, no lo he probado.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar