Blog Informativo de tecnologias en Ingenieria de Sistemas y Electronica

Copiar un archivo desde un computador a otro dentro de una red es un proceso llevado a cabo con mucha cotidianidad por las personas que se encuentren usando la maquina para compartir informacion, realizar un trabajo o simplemente chatear.

en muchas ocasiones cuando nos encontramos desarrollando una aplicacion para alguna empresa o institucion nos vemos en la necesidad de desarrollar un modulo a traves del cual funcionarios de varias oficinas intercambien archivos o correspondencia entre diferentes dependencias que la constituyen.

En esta ocasion vamos a desarrollar un sencillo un simple intercambiador de archivos entre varios equipos ubicados en una red LAN atraves del Protocolo IP.

Bien amigos, para el desarrollo de nuestra aplicacion haremos uso de una libreria que nos facilita los trabajos realizados con recursos de la red, la libreria se llama UNOLibs.Net y es muy usada por desarrolladores que tienden a realizar aplicaciones que impliquen funcionalidades de este tipo, se puede encontrar un ejemplo bien detallado en la siguiente URL: http://www.codeproject.com/KB/vb/UnoLibsNet_V2.aspx.

Primero que todo, elaboremos un diseño similar al que se observa en la siguiente imagen:

Como se puede ver en la imagen, hemos usado:

1 textbox para ingresar el usuario del equipo local

1 textbox para ingresar la ip del equipo remoto “al que le vamos a enviar el archivo”.

1 boton para conectarnos con el equipo queramos enviarle algun archivo

1 boton para escoger el archivo a enviar y realizar dicho envio.

1 textbox donde se muestra la ruta de guardado del archivo “en el computador local”.

1 boton para cambiar la ruta del archivo de guardado del archivo “en el computador local”.

1 richtextbox donde se mostrara informacion de la transferencia del agun archivo.

ademas, vamos a usar varios labels informativos y 2 barras de progreso para mostrar el estado de la transferencia del archivo, ya sea en la transmision o en la recepcion.

bien, continuando con nuestro programa, debemos de copiar la libreria UNOLibs.Net en la carpeta debug del proyecto tal y como vemos en la imagen:

ahora, es necesario agregar la la referencia a la libreria que hemos copiado al proyecto, para ello, nos dirigimos al menu proyecto y en el menu que aparece escogemos la opciona agregar referencia, en la nueva ventana que aparece seleccionamos la pestaña examinar y buscamos alli la libreria UNOLibs.Net que se encuentra en el directorio debug de nuestro programa:

listo, hacemos click en el boton aceptar y ya queda agregada la referencia, ahora vamos a realizar los siguientes imports en nuestra aplicacion:

Imports System.Net.Sockets
Imports System.Threading
Imports System.IO
Imports System
Imports System.Net.Dns
Imports UNOLibs.Net.ClientClass

Luego, hacemos las siguientes declaraciones de variables globales:

Dim cont As Integer
Dim v(10) As String
Dim Listener As New TcpListener(65535)
Dim Listener1 As New TcpListener(65534)
Dim clnt As New UNOLibs.Net.ClientClass
Dim WithEvents server As UNOLibs.Net.ServerClass
Dim WithEvents server2 As UNOLibs.Net.ServerClass

Litos, ya hemos realizado las declaraciones basicas para nuestro programa, ahora podemos pasar a programar lo necesario para determinar la conexion con el equipo deseado
de la siguiente manera:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click

Try

btnConnect.Text = "Conectando"

Dim pingresult As String = My.Computer.Network.Ping(Me.Text_ip.Text)

If pingresult = "True" Then
btnConnect.Text = "Conectado"
Else
btnConnect.Text = "Desconectado"
End If

Catch ex As Exception

End Try

End Sub

Basicamente lo que se realiza cuando se lleva a cabo la conexion con el otro pc es un ping, para determinar si el equipo es visible dentro de la red.

en el evento load va lo siguiente:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

CheckForIllegalCrossThreadCalls = False 'desactiva error por subproceso

txtSaveLoc.Text = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\"  'Mostramos la ruta de guardado

server = New UNOLibs.Net.ServerClass(65533, True, txtSaveLoc.Text)      'abrimos un puerto teniendo en cuenta la ruta de guardado local

server2 = New UNOLibs.Net.ServerClass(65532, True, "C:\")    'abrimos otro puerto pero este posicionara el archivo a guardar desde la raiz
' ("Se centra en el equipo remoto")

Dim ListThread As New Thread(New ThreadStart(AddressOf Listening))  'Crea los thread o hilos de ejecucion
ListThread.Start() 'Inicia los threas
Dim shostname As String

shostname = System.Net.Dns.GetHostName

Console.WriteLine("el nombre de tu maquina es: " & shostname)

End Sub

Desde este procedimiento se da por ejecucion a cada uno de los subprocesos o hilos usados para la aplicacion

Private Sub Listening()

Listener.Start()

Listener1.Start()

End Sub

Listo, ahora programemos el envio del archivo, para ello, hacemos doble click sobre el boton enviar archivo y escribimos lo siguiente:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

OpenFileDialog1.ShowDialog()

If DialogResult.OK Then

Try

RichTextBox1.Text += (Me.Text_usu.Text & " Esta enviando un archivo...") + vbCrLf

clnt.SendFiles(Me.Text_ip.Text, 65533, OpenFileDialog1.FileNames)

With ProgressBar2

.Minimum = 1

.Maximum = 10000

.Value = 1

.Step = 1

For i As Integer = .Minimum To .Maximum

' Perform one step of the action being tracked.

.PerformStep()

Next i

End With

MsgBox("El archivo se ha enviado con exito!", MsgBoxStyle.Information, "Notificacion")

Me.ProgressBar2.Value = 1

Catch ex As Exception

End Try

Else

Exit Sub

End If

End Sub

Basicamente la funcion clnt.SendFiles de la libreria Unolibs.net es la encargada de encapsular todo el proceso y de realizar el envio del archivo.
Como se ha podido ver, solo es necesario la ip del equipo al que le vamos a enviar el archivo, el puerto a utilizar y la ruta del archivo a enviar.

La otra parte del codigo corresponde al proceso de carga de la barra de progreso de envio para que se pueda observar la transferencia.

Listo, para realizar la programacion del boton cambiar ruta de guardado de archivo, programamos lo siguiente dentro de el:

Private Sub Button_cambiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_cambiar.Click

FolderBrowserDialog1.ShowDialog()

If DialogResult.OK Then

txtSaveLoc.Text = FolderBrowserDialog1.SelectedPath & "\"server.IncomingPath = txtSaveLoc.Text

Else

txtSaveLoc.Text = My.Computer.FileSystem.SpecialDirectories.MyDocuments

End If

End Sub

Por ultimo debemos crear la siguiente funcion, que es la encargada de procesar la recepcion del archivo:


Private Sub OnDiagnosticMessage(ByVal Args As String) Handles server.DiagnosticMessage

   Try

      RichTextBox1.Text += (Text_usu.Text & " - " & Args) + vbCrLf
      v = Split(Args, " ")
      cont = cont + 1
      Me.Label_cont.Text = cont

      With ProgressBar1
      .Minimum = 1
      .Maximum = 1000
      .Value = 1
      .Step = 1

        For i As Integer = .Minimum To .Maximum
         ' Perform one step of the action being tracked.
         .PerformStep()
        Next i
      End With

   Try
     If (v(3) = "terminated") Then
     MsgBox("La tranferencia del archivo ha finalizado correctamente!", MsgBoxStyle.Information, "Notificacion")
     cont = 0
     Me.Label_cont.Text = 0
     Me.ProgressBar1.Value = 1
     'RichTextBox1.Text += (" ") + vbCrLf
     End If
  Catch ex As Exception
  End Try

 Catch ex As Exception

 End Try
End Sub

Esenecialmente la instruccion encargada de mostrar los resultados del proceso de recepcion o transmision del archivo es:

 
RichTextBox1.Text += (Text_usu.Text & " - " & Args) + vbCrLf

ademas, se crea un vector llamado v() en el que se van guardando los estados por los que va pasando la transferencia del archivo;
Primero que todo se inicializa la transferencia.
luego se procesa el archivo entrante.
Posteriormente se recibe el archivo.
y por ultimo se cierra o finaliza la sesion de la transferencia del archivo.
esos 4 pasos son los que conforman una transferencia de archivos a traves de la libreria Unolibs.net.

la otra parte de la funcion OnDiagnosticMessage corresponde  a procesos que son necesarios para mostrar dinamicamente el progreso de la transferencia, a traves, de las barras de progreso de una manera muy interactiva.

Bueno, ahora vamos a observar nuestra a plicacion en ejecucion, para ello vamos a utilizar el virtualbox y vamos a colocar nuestro equipo virtual en red con el equipo real para poder comunicarnos satisfactoriamente:

usaremos las siguientes direcciones ip:

192.168.2.3 para el equipo anfitrion o real

192.168.2.7 para el equipo virtual

Luego verificamos que los equipos se encuentren correctamente en red, para ello hacemos ping:

1)ping del equipo virtual al equipo principal o real cuya ip es: 192.168.2.3

2) ping del equipo principal al virtual, cuya ip es: 192.168.2.7

Listo, como se ha observado, los equipo s se encuentran correctamente en red, ahora si, transfiramos un archivo:

inicialmente, escribimos nuestro nombre de usuario, he ingresamos la ip del otro equipo, posteriormente seleccionamos el archivo a enviar…

Luego Hacemos click en abrir y automaticamente comienza el envio del archivo…

Es importante tener en cuenta, que el programa tambien debe estar ejecutandose en el equipo que va a recibir el archivo, pues se esta realizando una comunicacion por sockets y es necesarios que ambos equipos tengas los puertos de la aplicacion abiertos.

en la siguiente imagen se puede observar que el equipo virtual recibio el archivo correctamente:

Por ultimo, para comprobar que el archivo fue recibido correctamente podemos entrar a mis documentos desde el equipo al que le enviamos el archivo y observamos que el archivo alli esta!.

Si queremos cambiar la ruta de guardado del archivo, podemos hacerlo haciendo click en el boton que lo especifica pero hay que tener en cuenta que tenemos que cambiarla es desde el programa que se ejecuta en el equipo que recibira el el archivo y no en el que lo va a enviar, pues es una configuracion que debe hacerse para el equipo local y la libreria Unolibs.net no nolos permite hacer de forma remota.

eso es todo en este tutorial, espero y haya sido de su agrado el tema y lo hayan comprendido facilmente…. hasta la proxima!

Descargar Programa

About these ads

Comentarios en: "Transferir archivos desde un pc a otro con vb.net" (18)

  1. Un poco tarde el comentario, pero recien encuentro tu post, esta muy interesante pero no logro entender que hace Dim Listener As New TcpListener(65535) y que pasaria si no se crea, saludos.

    • Hola Maxpein, Gracias Por tu Comentario, respecto a tu pregunta la variable Listener que se crea como un objeto de tipo TcpListener(65535) correponde a una definicion de un puerto de escucha que se usa para poder recibir o enviar un archivo de acuerdo a como este configurado el programa, dicho puerto se activa en la funcion listenig() de tal manera que se ejecute de forma paralela (hebra) al programa principal.
      Como estoy utilizando la libreira Unolibs.net es necesario estar creando puertos ya que la comunicacion es a traves de sockets y es conveniente evitar que los puertos a habilitar sean diferentes. Eso es todo amigo! disculpa si te respondi un poco tarde, espero y te sea util la respuesta….

  2. Rey Varags dijo:

    Me parece un articulo muy interesante, bien planteado y explicado, te felicito

  3. excelente!!

  4. Mas Que Excelente… esta Super Super bueno…. Muy buen Aporte…. PURA VIDA..!!!!

  5. Estimado Ingsistele, tu codigo me parece muy interesante y practico, pero es el segundo donde encuentro este “IncomingPath” que visual basic 2010 no me reconoce.. tampoco pude abrir tu codigo con este.. sabrias decirme cual es la razon?
    saludos y gracias por compartir..

  6. Queria comentarte que ya pude hacer correr el programa, descargando este convertidor.. que tambien me solucionó la linea azul bajo “IncomingPath”..
    link del convertidor: http://www.emmet-gray.com/Articles/ProjectConverter.htm

  7. TREMENDO !! una vez mas, gracias por este aporte tan enriquecedor que servira de guia para muchos proyectos..

    • De nada compañero Ale, me da gusto que la aplicacion te haya sido de utilidad, el conocimiento es para compartirlo y eso es lo que me gusta hacer, ahh por cierto no conocia ese convertidor que mencionaste arriba (para pasar codigo de vb 2005 o 2008 a 2010) es muy util y la linea incomingPath hace referencia a la ruta del archivo transferido y por razones de compatibilidad solo es compatible hasta el netframework 3.5 con versiones superiores de la plataforma (netframework 4.0) la libreria es algo inestable.

  8. Jhonnson dijo:

    PRIMERO FELICITARTE POR TU APORTE ESTA EXCELENTISIMO, SEGUNDO, QUISIERA PREGUNTARTE SI HABRIA UN CONFLICTO SI DOS PCs ENVIAN ARCHIVOS A UNA PC DE FORMA SIMULTANEA…..

    • Hola Jhonnson, respecto a tu pregunta, la libreria maneja un control de concurrencia en cuanto a la transferencia de algun archivo, es decir, que un pc solo puede transmitir o recibir un archivo a la vez mientras este se empareja y transfiere con el otro computador, una vez haya terminado el proceso de transferencia, la aplicacion que esta en el pc que recibe un nuevo archivo comenzara a procesar dicha transferencia. En pocas palabras si varios computadores intentan enviar un archivo a un pc de forma simultanea solo sera enviado el que primero logre comunicarse y emparejarse con el pc destino.

  9. Hola Ingsistele, se ve muy bien el tutorial, solo que revisando la liga para descargar el ejemplo no me muestra la pagina, lo puedes volver a publicar o bien me puedes ayudar a obtenerlo?
    Gracias

    • Hola Oscar, el Link te lleva a la pagina de 4shared que es el servidor donde tengo alojados mis archivos, para poder descargarlo debes estar registrado en la pagina de 4shared. Pero si deseas, puedes descargarlo desde mediafire que tambien lo he subido alli, el link es: Descargar Programa Por Mediafire

  10. Hola, probe tu codigo pero me da el siguiente error: “Error retrieving port from server”
    porque puede ser?
    muchas gracias.

    • Verifica que de verdad tengas conexion a la red a traves de la cual vas a transferir el archivo o que el firewall de red este desactivado, tal vez te este bloqueando el puerto del comunicacion.

  11. Dan snaider dijo:

    muy bueno de casualidad no tienes un chat?

  12. Muy buen aporte, pero es posible que el usuario a quien se le esta enviando el archivo deba aceptar recibirlo??? de ser asi como se haria esto porque no veo algo que lo pueda controlar en la dll, muchas gracias

  13. ROMAN RODRIGUEZ dijo:

    hola amigo disculpa, si se quieren conectar varios usuarios a ese puerto. Es posible? o es un puerto por peticion?

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Nube de etiquetas

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: