Título: Enviar Imagenes por Winsock
Publicado por: Brian1511 en 13 Agosto 2013, 19:38 pm
Hola a todos aqui les vengo con una duda y es como envio imagenes a un winsock de Cliente a Cliente. Que haga la siiguiente funcion Cliente <-> Servido <-> Cliente Tengo este codigo que encontre de una web pero solo envia una imagen pero quiero que envie porlomenos 5 o 6 imagenes de cliente a cliente. 'Función Api Sleep Para generar una espera o retardo de tiempo Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'Array de bytes para el gráfico Dim imagen() As Byte 'Estas dos variables son 2 flags Dim flag As Boolean Dim progreso As Boolean 'Este Command es para conectarse al servidor '********************************************************************* Private Sub Command1_Click() 'Conectamos a la Ip y puerto Winsock1.Connect Text1, CInt(Text2) 'Mostramos la Ip de conexión en el caption del Formulario Me.Caption = "Estado de la conexion: Conectado a la IP: " + Text1 'Esto deshabilita y habilita controles Command3.Enabled = True: Command1.Enabled = False: Command2.Enabled = True End Sub 'Este Command es para desconectarse del servidor '********************************************************************* Private Sub Command2_Click() 'habilitamos y deshabilitamos los command Command2.Enabled = False: Command1.Enabled = True 'cerramos la conexión Winsock1.Close End Sub 'Este Command es el que abre el cuadro de diálogo para seleccionar la imágen '********************************************************************* Private Sub Command3_Click() On Error GoTo mensaje With CommonDialog1 .DialogTitle = "Seleccionà el archivo de imagen" .ShowOpen If .FileName = "" Or .CancelError = True Then Exit Sub 'salimos si cancelamos If MsgBox("¿Seleccionaste el archivo correcto??", vbInformation + vbYesNo, _ "Enviar archivo de imagen") = vbNo Then Exit Sub Winsock1.SendData .FileName 'enviamos la ruta Picture1 = LoadPicture(.FileName) 'Cargamos la imagen en el Picture1 End With Command4.Enabled = True Command3.Enabled = False Exit Sub mensaje: If Err.Number = 40006 Then MsgBox Err.Description, vbInformation, _ "Error en la conexion": Command2_Click: Me.Cls End Sub 'Este Command es el que envía la imágen al servidor '********************************************************************* Private Sub Command4_Click() Dim tamaño As Long progreso = True 'abrimos el archivo en modo binario de lectura Open CommonDialog1.FileName For Binary Access Read As #1 tamaño = LOF(1) 'Tamaño en bytes de la imagen 'Redimensionamos el Array ReDim imagen(tamaño - 1) 'Leemos todo el archivo y lo almacenamos en el array imagen Get #1, , imagen Close flag = True 'Enviamos el array al servidor Winsock1.SendData imagen 'Para el progreso del envio ProgressBar1.Max = tamaño + 1 End Sub Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, _ ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal _ HelpContext As Long, CancelDisplay As Boolean) MsgBox "Error: " + Description End Sub 'Este evento se dispara cuando se terminó de enviar completamente _ todos los datos '***************************************************************** Private Sub Winsock1_SendComplete() 'Hacemos una pausa Sleep 1500 If flag Then Command4.Enabled = True If flag Then Winsock1.SendData 1: flag = False Command4.Enabled = False Command3.Enabled = True If progreso Then ProgressBar1.Value = 0 progreso = False End If End Sub 'Muestra mediante el evento SendProgress en la barra de progreso '***************************************************************** Private Sub Winsock1_SendProgress(ByVal bytesSent As Long, ByVal _ bytesRemaining As Long) If progreso Then ProgressBar1 = ProgressBar1 + bytesSent ' bytesSent son los bytes enviados End If End Sub Private Sub Form_Load() Dim ancho As Integer Me.ScaleMode = vbPixels: Me.ForeColor = vbBlue Text1 = "127.0.0.1": Text2 = 1000 Command1.Caption = "conectar": Command2.Caption = "desconectar": _ Command3.Caption = "-->> Buscar archivo de imagen para enviar al servidor": _ Command4.Caption = "Enviar" ancho = TextWidth(Command3.Caption) Command3.Width = ancho + ancho / 10 Command2.Enabled = False: Command4.Enabled = False: Command3.Enabled = False Label1.Caption = "Direccion ip" Label2.Caption = "Puerto" Label1.AutoSize = True: Label2.AutoSize = True Me.Caption = "No conectado" End Sub Private Sub Form_Resize() On Error Resume Next Label1.Left = 10: Text1.Left = Label1.Width + 20: Label2.Left = Text1.Left + _ Text1.Width + 20: Text2.Left = Label2.Left + Label2.Width + 10 Label1.Top = 20: Label2.Top = 20: Text1.Top = 20: Text2.Top = 20 Command3.Left = 20: Command3.Top = Text1.Top + Text1.Height + 20 Command1.Left = Me.ScaleWidth - Command1.Width - 20 Command2.Left = Me.ScaleWidth - Command2.Width - 20 Command4.Left = Me.ScaleWidth - Command4.Width - 20 Command1.Top = 20: Command2.Top = 20 + Command1.Height: Command4.Top = 50 + _ Command2.Top ProgressBar1.Left = 20: ProgressBar1.Width = Me.ScaleWidth - 40 ProgressBar1.Top = Me.ScaleHeight - ProgressBar1.Height - 10 Picture1.Left = 20: Picture1.Top = Command3.Top + 30: Picture1.Height = _ Me.ScaleHeight - ProgressBar1.Height - Command3.Height - Text1.Height - 60 Picture1.Width = Me.ScaleWidth - Command2.Width - 50 End Sub
Dim flag As Boolean, nombre As String Private Sub Command1_Click() 'Ponemos a la escucha el Winsock Winsock1.Listen Command1.Enabled = False Command2.Enabled = True End Sub Private Sub Command2_Click() 'Desconectamos el Winsock Winsock1.Close Command1.Enabled = True Command2.Enabled = False End Sub Private Sub Command3_Click() End End Sub 'Esto le asigna los caption y demás a los controles Private Sub Form_Load() Me.ScaleMode = vbPixels Winsock1.LocalPort = 1000 'Le establecemos el puerto Command1.Caption = "poner a la escucha" Command2.Caption = "Desconectar" Command3.Caption = "salir" Check1.Caption = "Eliminar las imagenes temporales del directorio" Me.Caption = "puerto determinado de comunicacon: 1000" End Sub 'Redimensionar controles Private Sub Form_Resize() On Error Resume Next Command1.Top = Me.ScaleHeight - Command1.Height Command2.Top = Me.ScaleHeight - Command2.Height Command3.Top = Me.ScaleHeight - Command3.Height Command1.Left = 10: Command2.Left = Command1.Width + 10: _ Command3.Left = Me.ScaleWidth - Command3.Width - 10 Picture1.Width = Me.ScaleWidth - 20 Picture1.Left = 10 Me.Height = Screen.Height / 2 Check1.Left = 10 Check1.Top = Me.ScaleHeight - Command1.Height - Check1.Height End Sub Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) Winsock1.Close Winsock1.Accept requestID End Sub 'Procedimiento que recibe los datos del cliente Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) 'Array dinámico para almacenar el archivo Dim imagen() As Byte Select Case flag Case False 'Esto se encarga de obtener el nombre del fichero Winsock1.GetData nombre nombre = Right(nombre, Len(nombre) - InStrRev(nombre, "\")) Open App.Path + "\" & nombre For Binary As #1 flag = True Case True 'Esto escribe en el disco el archivo de imagen Winsock1.GetData imagen If UBound(imagen) = 1 Then Close Picture1 = LoadPicture(App.Path + "\" + nombre) 'Si está chequeado el chek eliminamos el archivo cuando finaliza If Check1 Then Kill App.Path + "\" + nombre flag = False Exit Sub End If 'Escribimos en disco la imagen con Put pasandole el Array Put #1, , imagen End Select End Sub
Si alguien puede ayudarme! :D
Título: Re: Enviar Imagenes por Winsock
Publicado por: noalg en 13 Agosto 2013, 21:07 pm
Vas a tener que adaptar el codigo para que el servidor cuando reciva la imagen la reenvie al cliente deseado, tambien diferenciando las conexiones que hacen los clientes(si es un mensaje, un envio de foto, u otros). Aunque si vas a enviar muchos archivos o imagenes la conexion C-S-C puede resultar lenta, quizas podrias abrir conexiones C-C para las partidas o envios de archivos.
Título: Re: Enviar Imagenes por Winsock
Publicado por: Brian1511 en 13 Agosto 2013, 23:32 pm
Me parece muy buena tu respuesta, no conoces algo parecido a esto ? he buscado y pues no encuentro como hacerlos.
Título: Re: Enviar Imagenes por Winsock
Publicado por: noalg en 14 Agosto 2013, 14:58 pm
Bueno debes enviar indetificadores del mensaje en cada envío, para que de esta forma el servidor o cliente sepa como reaccionar ante esta información. Puedes enviar informacion de esta manera: "IDENTIFICADOR|MENSAJE" Por ejemplo: "msg|usuario7249|hola que tal" Private Sub ws_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim Datos As String Dim vDatos As Variant ws(Index).GetData Datos 'Obtenemos los datos vDatos = Split(Datos, "|") 'Separamos segun el identificador | Select Case vDatos(0) 'Hacemos una seleccion segun la primera parte de el mensaje Case "msg" 'En caso de que quiera enviar un mensaje a un usuario 'Funcion que envia un mensaje(vDatos(2)) al usuario(vDatos(1)) EnviarMensaje(vDatos(1),vDatos(2)) End Select End Sub
Título: Re: Enviar Imagenes por Winsock
Publicado por: Brian1511 en 15 Agosto 2013, 05:01 am
gracias amigo me sivio tu aporte muchas gracias! :D
Título: Re: Enviar Imagenes por Winsock
Publicado por: noalg en 15 Agosto 2013, 13:13 pm
Nada hombre si tienes mas dudas pregunta
|