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.
"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


0