Problema enviar archivo

Iniciado por Jareth, 1 Abril 2007, 00:41 AM

0 Miembros y 1 Visitante están viendo este tema.

Jareth

Hola,veran este codigo no me va para hacer lo que quiero,enviar una imagen recibirla,y cargarla en un picture.
Servidor:

dim ar as string
Open "c:\capture.jpg" For Binary As #1
ar = Space(LOF(1))
Get #1, , ar
Close #1
WS.SendData "paco|" & ar


Cliente:

Case "paco"
Dim ar As String
Open "c:\captura1.jpg" For Binary Access Write As #1
Put #1, , sData(12)
Close #1
Form4.Picture1.Picture = LoadPicture("c:\capture.jpg")


Aqui debe estar el problema,he probado en vez acces write solo binary y la verdad no se que puede pasar,supongo que todo el code esta bien,lo he hecho yo pero deberia funcionar y no me va.
De antemano muchas gracias.
Saludos.

vivachapas

el problema es q no puedes enviar archivos muy grandes con winsock... debes dividirlos en paquetes y enviarlos de a uno y para recibirlso debes juntarlos... no se mucho del tema pero seguro alguien te explica mas... o si buscas como encuentras

Jareth

Es una foto peor probaré a partirlo y juntarlo.

yovaninu

para enviar un archivo de cualquier tamaño a traves del winsock, no tienes que dividirlo tu, eso lo hace el protocolo tCP/ip, lo que tu tienes que hacer es recibirlo paquete a paquete.

si el cliente envia, pues es en el servidor donde tendras que juntar los paquetes y viceversa.

ejemplo de enviar un archivo desde el cliente al servidor:

cliente:

Open "c:\unarchivo.jpg" For Binary As #1
  filedata = Input(LOF(1), 1) 'en esta variable string cargo todo el archivo
Close #1

ruta="d:\" 'en esta variable esta la ruta en donde se copiara en el servidor el archivo que envio

filesize = Len(filedata) 'aqui calculo el tamaño de lo que estoy enviando (long) en bytes

Winsock1.SendData "enviar" & "|" & filesize & "|" & ruta 'envio prmeramente una clave "enviar" luego el tamaño "filesize" y la ruta  "ruta"... (aun no estoy enviando el archivo en si)


ahora te vas al servidor:


Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
WS.GetData datosS

If Left(datosS, 7) = "archivo" Then
    dato = Split(datosSS, "|") 'una variable dato (dim dato() as string) se encarga de dividir clave, tamaño y ruta
    filesize = dato(1) 'aqui tengo el tamaño enviado por el cliente
    Path = dato(2) 'aqui la ruta
    viene_archivo = True 'prendo un interruptor
    Winsock.SendData "enviar" 'ahora si le pido al cliente que envie el archivo en si
    datosSS = ""
End If


pasamos al cliente:

Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)

Winsock.GetData DAToS

If DAToS= "enviar" Then

Winsock.SendData filedata 'aqui es donde realmente envia... aqui es donde el protocolo se encargara de dividir los paquetes... en el servidor habra que juntarlos uno a uno
End If


servidor:


Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
WS.GetData datoS

If viene_archivo = True Then
   'declarar arriba: Dim Datos2 As String
   datos2 = datos2 & datoS 'lo que te decia: juntamos parte por parte el archivo que el cliente esta enviando

    If Len(datos2) = filesize Then 'si termina
      Open Path & "nuevoArchivo.jpg" For Binary As #4 'asumo que envias un JPG, sino vas a tener que usar un CommonDialog en el cliente si quieres usar el mismo nombre de archivo que envias del cliente
       Put #4, 1, datos2
      Close #4
      viene_archivo = False 'apagas el interruptor
      datos2 = "" 'vaceas el buffer
      MsgBox "Archivo Recibido con Éxito." 'vuala, aqui termina todo el proceso y depues de esto supongo que tendras que cargar la imagen recibida a un picture, eso ya es tu trabajo.
    End If
End If


si deseas mas info, postea

~~

Mira aki tienes otro ejemplo, q a mi me parece mas simple xD sera por q siempre lo uso  ;D ;D

Jareth

He probado los 2 codes y no me va,yo lo que quiero es enviar la imagen que capturo,un screen capture pero lo tengo en un timer claro,y me llegan algunos bytes de la imagen no se volveré a probar.

~~

Pues deberia funcionarte.. Has compilado el mio tal y como te lo e puesto?? (cambiando lo unic olas rutas xD)

A ver el funcionamiento es el siguiente:

El cliente hace la petiion de un archivo.
El server enbia al cliente el tamaño del archivo.
El cliente pone en marcha un interruptor. A partir de ese momento y hasta q el tamaño de datos recibidos sea igual al tamaño q nos enviaron antes alamcenamos.
Una vez tengamos todo lo guardamos en un archivo

Ese es el funcionamiento. Es simple, deberia funcionarte..

Jareth

Pongo el code(yo quiero hacer un screen capture):
Servidor:

Private Sub Timer1_Timer()
Dim foto As New cJpeg
Dim ar As String
Dim filesize As String
foto.SetSamplingFrequencies 2, 2, 2, 2, 2, 2
foto.Quality = 50   ' aqui ajustas la calidad dsd 1 a 100 hasi bajas calidad bajas peso
foto.SampleScreen
foto.SaveFile ("c:\" & "\capture12" & ".jpg")
Open "c:\capture.jpg" For Binary As #1
ar = Input(LOF(1), 1)
filesize = Len(ar)
Close #1
WS.SendData "paco|" & filesize & ar

End Sub


Cliente:

Case "paco"

Dim ar As String
Dim filesize As String

Dim datos2 As String
filesize = sData(1)
datos2 = datos2 & sData(2)
enviar "yeah|"

If Len(datos2) = filesize Then
Open "c:\captura1.jpg" For Binary As #1
Put #1, , datos2
Close #1

datos2 = ""
Form4.Picture1.Picture = LoadPicture("c:\captura1.jpg")
End If


Y nada,0 bytes,antes alemnos me hizo 663 bytes pero ahora 0 y es cierto porque es el valor qeu tiene sdata(1).
No sé que hago mal.
Espero me puedan ayudar.

vivachapas

yovaninu muy buena explicacion! al fin eh entendido casi todo!

lo q no entiendo es q significa esta linea

CitarIf Left(datosS, 7) = "archivo" Then

para q es el left(datoS,7)???

Citarviene_archivo = True 'prendo un interruptor

y como se hace el interruptor? asi nomas? eso es todo? y para q sirve...

Jareth

lo del left es: empezando desde la derecha,contamos 7 caracteres
es decir left(datosS,7) seria de izquierda a derecha solo miramos los 7 primeros,si es igual a "archivo" pues hacemos la accion.
El interruptor es un boolean que lo activa y lo desactiva para hacer acciones o saber el estado,lo activa al principio y luego comprueba el estado de  este para realizar una accion.
Saludos

pd:la verdad es que la explicacion si esta muy bien pero aun sigo sin que funcione...