Autor
|
Tema: Problema enviar archivo (Leído 11,412 veces)
|
Jareth
Desconectado
Mensajes: 334
|
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.
|
|
|
En línea
|
|
|
|
vivachapas
Desconectado
Mensajes: 612
|
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
|
|
|
En línea
|
|
|
|
Jareth
Desconectado
Mensajes: 334
|
Es una foto peor probaré a partirlo y juntarlo.
|
|
|
En línea
|
|
|
|
yovaninu
Desconectado
Mensajes: 349
|
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
|
|
|
En línea
|
|
|
|
~~
|
Mira aki tienes otro ejemplo, q a mi me parece mas simple xD sera por q siempre lo uso
|
|
|
En línea
|
|
|
|
Jareth
Desconectado
Mensajes: 334
|
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.
|
|
|
En línea
|
|
|
|
~~
|
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..
|
|
|
En línea
|
|
|
|
Jareth
Desconectado
Mensajes: 334
|
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.
|
|
|
En línea
|
|
|
|
vivachapas
Desconectado
Mensajes: 612
|
yovaninu muy buena explicacion! al fin eh entendido casi todo! lo q no entiendo es q significa esta linea If Left(datosS, 7) = "archivo" Then para q es el left(datoS,7)??? viene_archivo = True 'prendo un interruptor
y como se hace el interruptor? asi nomas? eso es todo? y para q sirve...
|
|
|
En línea
|
|
|
|
Jareth
Desconectado
Mensajes: 334
|
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...
|
|
|
En línea
|
|
|
|
|
|