Aplicaciones Cliente/Servidor en Visual Basic utilizando el Control WinSock

Escrito por Mariano González el Jueves 07 de Marzo de 2002 a las 00:00hs

Aprederemos a crear una aplicacion cliente / servidor utilizando el componente Winsock bajo Visual Basic.

Conceptos b?sicos de programaci?n Cliente/Servidor

Un programa simple es un conjunto de instrucciones que generalmente devuelven un valor al usuario, ya sea num?rico o una cadena de letras, este dato es el resultado de la acci?n del usuario sobre el programa, ya que el usuario fue el que solicit? el dato.
Al igual que un usuario se comunica con el programa por medio del teclado, dos programas se pueden comunicar entre s? por medio de un control especial que se denomina WinSock Control. Este control esta disponible en el lenguaje Visual Basic, y su nombre proviene de Windows Sockets.

El Winsock Control como opci?n predeterminada no se encuentra disponible en la barra de controles est?ndar de Visual Basic, para acceder a ?l debemos agregarlo manualmente mediante Proyecto> Componentes> y luego seleccionar WinSock Control y Aceptar. No es visible en tiempo de ejecuci?n, lo que significa que solo nosotros sabemos que el control se encuentra en nuestra aplicaci?n y cu?les son sus propiedades, aunque tambi?n se pueden definir en tiempo de ejecuci?n.

Este tipo de aplicaciones Cliente/Servidor permiten comunicar programas entre s?, en consecuencia tambi?n permiten comunicar varias computadoras, porque habiendo un programa en la computadora llama "Oscar_1" y otro en la computadora llama "Daniel_1" ambos programas se pueden comunicar a trav?s de Internet y compartir informaci?n, o adquirir informaci?n sin saber que el due?o de la computadora lo autoriza. Esto frecuentemente trae problemas al querer distinguir si un programa esta autorizado por el due?o o el encargado (administrador o sysop) para acceder al sistema. Varios administradores permiten el acceso, pero a la misma vez restringen las carpetas importantes de sus computadoras para no correr el riesgo de perder informaci?n vital.

Si el programa que se usa para acceder a otra computadora esta autorizado por el encargado de la PC se puede denominar "Herramienta de administraci?n remota", en cambio si el acceso no es permitido o no se avisa que se quiere entrar y se hace a la fuerza el programa recibe el nombre de "Troyano".

Comenzando a programar con WinSock Control.

Protocolos TCP/IP y UDP

Como anteriormente qued? aclarado dos programas se pueden conectar entre s? a trav?s de internet o de una LAN.
Internet usa el protocolo TCP/IP que significa "Transmision Control Protocol / Internet Protocol", es el que se encarga de recibir paquetes de informaci?n y redirigirlos al usuario final que los solicit?. Este protocolo es el preferido por todos ya que posee una caracter?stica que UDP le envidia, TCP/IP puede verificar que el paquete de informaci?n haya llegado con ?xito al destinatario final, concretando as? la transacci?n.

Por el contrario UDP no puede hacer esto, solo manda el paquete con la informaci?n y no verifica que haya llegado satisfactoriamente, poniendo de esta manera en peligro al paquete, ya que puede no llegar entero al destinatario y por lo tanto no sirve si el paquete no llega en su totalidad.

Todas las m?quinas que est?n conectadas a Internet tienen asignadas un n?mero que se forma con 4 cifras de 3 d?gitos (que no pueden superar al n?mero 255). Ejemplo del IP m?ximo que se puede encontrar: 255.255.255.255

Propiedades, m?todos y eventos de WinSock

Una vez que tenemos el WinSock control en nuestra barra de controles en Visual Basic ya podemos comenzar a ver las propiedades, eventos y m?todos m?s importantes del control. Para agregarlo manualmente ir a Proyecto> Componentes> y luego seleccionar WinSock Control y Aceptar. Como mencionamos anteriormente este control no es visible en tiempo de ejecuci?n.

Primero abrimos un proyecto (EXE Est?ndar) y colocamos en control en cualquier parte del formulario. Vamos a comenzar por ver las propiedades, estas pueden ser puestas en tiempo de dise?o como tambi?n en tiempo de ejecuci?n. A continuaci?n las propiedades m?s importantes.

Lista de propiedades m?s importantes

  • LocalIP: Devuelve la direcci?n IP de la m?quina local en el formato de cadena con puntos de direcci?n IP (xxx.xxx.xxx.xxx).
  • LocalHostName: Devuelve el nombre de la m?quina local.
  • RemoteHost: Establece el equipo remoto al que se quiere solicitar la conexi?n.
  • LocalPort: Establece el puerto que se quiere dejar a la escucha.
  • RemotePort: Establece el n?mero del puerto remoto al que se quiere conectar.
  • State: Verifica si el Control WinSock esta siendo utilizado o no.

Estas son algunas de las propiedades m?s importantes, y a continuaci?n la sintaxis de cada propiedad.

Objeto.Propiedad = Valor

Donde Objeto va el nombre del Control WinSock, el nombre predeterminado cuando lo incluimos en alguna aplicaci?n es "WinSock1". Luego le sigue la propiedad que deseamos asignar y finalmente el valor que la misma tomar?.

Entonces por ejemplo si queremos probar la propiedad LocalIP debemos seguir el ejemplo 1.

Ejemplo 1

Crear un Proyecto (EXE Est?ndar) y agregar el WinSock Control. Luego agregar una etiqueta vac?a, es decir un Label. Despues introducimos el siguiente c?digo.

Private Sub Form_Load()
Label1.caption = WinSock1.LocalIP
End Sub


Este simple ejemplo nos da de forma r?pida nuestro IP, aunque no estemos conectados a Internet el IP aparece igual, solo que siempre va a tomar el valor : 127.0.0.1

Ahora que sabemos manejar las propiedades podemos seguir con los M?todos. A continuaci?n la lista de algunos de los M?todos m?s importantes del Control WinSock.

Lista de M?todos m?s importantes

Accept: S?lo para las aplicaciones de servidor TCP. Este m?todo se utiliza para aceptar una conexi?n entrante cuando se est? tratando un evento ConnectionRequest.
GetData: Recupera el bloque actual de datos y lo almacena en una variable de tipo Variant.
Listen: Crea un socket y lo establece a modo de escucha.
SendData: Env?a datos a un equipo remoto

Lista de Eventos m?s importantes.

  • ConnectionRequest: Se produce cuando el equipo remoto solicita una conexi?n. Sin este evento no se puede llevar a cabo la conecci?n.
  • Connect: Se produce cuando el equipo local se conecta al equipo remoto y se establece una conexi?n.
  • Close: Se produce cuando el equipo remoto cierra la conexi?n. Las aplicaciones deben usar el m?todo Close para cerrar correctamente una conexi?n TCP.
  • DataArrival: Se produce cuando llegan nuevos datos. Este evento es importante, ya que debemos hacer algo con la informaci?n que llega.

La sintaxis de los m?todos y eventos es igual a la sintaxis de las propiedades, por lo cual no vamos a hacer referencia a ella.

Programando la primera aplicaci?n Cliente/Servidor

Conociendo las propiedades, m?todos y eventos del Control WinSock podemos pasar a la engorrosa labor de la programaci?n. Para poder programar la siguiente aplicaci?n necesitan tener el Control WinSock en el formulario, eso siempre es fundamental para que el programa ande.

Para enterder el correcto funcionamiento del protocolo TCP/IP vamos a empezar por programar la aplicaci?n Servidor a la cual luego se conectar? el Cliente.

Comenzamos por crear un proyecto nuevo (EXE est?ndar) para el Servidor, y agregamos la siguiente lista de controles al formulario principal. La ubicaci?n de dichos controles es a gusto del programador, siempre tratando de que el usuario final este a gusto con el producto y que se pueda manejar libremente sin problemas por el entorno del mismo.

  • WinSock Control
  • 2 cajas de texto (TextBox)
  • 2 botones.

A continuaci?n hace falta que cambiemos algunas propiedades de los controles, debajo la lista de controles con las respectivas propiedades a cambiar.

Control (nombre predeterminado) Propiedad (nuevo valor)
WinSock1 LocalPort = 888
Text1 Text = ""
Text2 Text = ""
Command1 Caption = "Escuchar"
Command2 Caption = "Enviar"

Para que el ejemplo funcione a la perfecci?n conviene que seguir la ubicaci?n de los controles como esta indicado en la figura 1.


Figura 1

Una vez hecho esto podemos empezar a tipear c?digo. El sangrado del programa es una cuesti?n de entendimiento para el programador, algunos recurren a ?ste como otros no, eso tambi?n queda a criterio del que programa.

En el Evento Click del Command1 incluimos el siguiente c?digo...

Private Sub Command1_Click()
Winsock1.Listen
End Sub


Esto hace que el Control WinSock empiece a funcionar, escuchando el puerto que se indic? en las propiedades de dicho control. Este puerto es el 888. Ahora si realizamos todo a la perfecci?n el puerto 888 esta siendo vigilado para aceptar conexiones remotas.

Luego en el Evento DataArrival del WinSock...

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
Winsock1.GetData datos
Text1.Text = Text1.Text + datos
End Sub


Datos queda transformada en una variable de cadena, y WinSock almacena los datos que recibe del Cliente en el buffer y luego ingresan a la variable datos, dicha variable mostrar? su contenido en el control TextBox (Text1).

En el evento ConnectionRequest...

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
Winsock1.Accept requestID
End Sub


Este evento es muy importante, permite aceptar la petici?n de conexi?n. Sin este evento el resto del programa no tendr?a efecto.

En el evento Click del Command2...

Private Sub Command2_Click()
Dim enviar As String
enviar = Text2.Text
Winsock1.SendData enviar
End Sub


Esto permite enviar el texto que se introduzca en el TextBox n?mero 2.

Por ahora este es un simple programa Servidor, lo que hace es: designar un puerto, dejarlo a la escucha para aceptar conexiones, si se realiza una petici?n de conexi?n aceptarla, y por ?ltimo enviar datos al Cliente y recibir los datos que ?ste mande.

Para seguir programando el Cliente hace falta crear un nuevo proyecto y en el formulario principal incluir la siguiente lista de controles:

  • WinSock Control
  • 3 cajas de texto (TextBox)
  • 2 botones.

Como lo hicimos anteriormente hace falta cambiar algunas propiedades. Debajo la lista de controles con las respectivas propiedades para cambiar.

Control (nombre predeterminado) Propiedad (nuevo valor)
WinSock1 LocalPort = 888
Text1 Text = ""
Text2 Text = ""
Text3 Text = ""
Command1 Caption = "Conectar"
Command2 Caption = "Enviar"

Para tener una referencia de c?mo situar los controles conviene seguir la Figura 2...


Figura 2

En el m?todo del Command1...

Private Sub Command1_Click()
Winsock1.RemoteHost = Text3.Text
Winsock1.Connect
End Sub


El evento connect permite conectar al programa servidor que esta esperando la solicitud, este evento requiere un par?metro fundamental, el IP o nombre de host el cual es introducido previamente a la conexi?n en el cuadro de texto n?mero 3 (Text3).

En el evento DataArrival del WinSock Control...

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
Winsock1.GetData datos
Text1.Text = Text1.Text + datos
End Sub


Esto permite a la aplicaci?n (a trav?s de WinSock) recibir informaci?n del servidor y mostrarla en pantalla.

En el m?todo del Command2...

Private Sub Command2_Click()
Dim enviar As String
enviar = Text2.Text
Winsock1.SendData enviar
End Sub

Estas instrucciones son necesarias para enviar informaci?n al servidor.

Este ejemplo del primer programa Cliente / Servidor es muy simple, para utilizarlo al m?ximo es necesario por ejemplo poner las propiedades de los TextBox en Multiline, lo que hace que si los datos recibidos exceden el tama?o del TextBox estos datos vayan directo a la l?nea de abajo.

Toda la informaci?n aqu? expuesta fue escrita por Mariano Gonz?lez y fue tomada de dos diferentes fuentes, libros e Internet.

Libros

  • Baltazar & Mariano Birnios, Creaci?n de Aplicaciones Multimedia con Visual Basic, editorial MP Ediciones, primera edici?n, Buenos Aires, 1998.
  • Baltazar & Mariano Birnios, Microsoft Visual Basic Manual de Referencia, editorial MP Ediciones, primera edici?n, Buenos Aires, 1999.

Internet

  • http://msdn.microsoft.com/vb (En Ingl?s)
  • http://www.vb-herlper.com (En Ingl?s)
  • http://www.vbexplorer.com (En Ingl?s)
  • http://www.cgvb.com (En Ingl?s)
  • http://www.vb-world.net (En Ingl?s)
  • http://www.planet-source-code.com/vb (En Ingl?s)
  • http://www.programmersheaven.com?(En Ingl?s)
  • http://www.programacion.net (En Espa?ol)
  • http://www.abcdatos.com (En Espa?ol)
  • http://www.monografias.com (En Espa?ol)

Tambi?n se puede consultar la ayuda en l?nea de Microsoft Developer Network (MSDN) o consultarla desde los CDs del Visual Studio.


comentarios



  1. Estimado no me funciona vota error al enviar el dato ...que puede ser? lo que hice el mismo ejemplo pero al cliente le agregue un label para saber la ip de la maquina, en el txt3 agrego la direccion arrojada por la otra maquina, le doi a conectar, la otra maquina ya tenia el puerto en escucha, al enviar el contenido de txt2 arroja el error .......

    de antemano gracias

    atte

    Eduardo



  2. Jeje a mi me pasa lo mismo :p

    qe sera ?

    pero no puse lo d la ip



  3. Hola me allamo alejandro yengo un problema es que no puedo hacer andar las aplicaciones cliente/servidor por internet en diferente maquinas Ej. Servidor en mi casa y cliente en mi trabajo, agradeseria que alguiebn me ayude.
    Saluda atentamente ALEJANDRO PALACIOS.



  4. Ha disculpen si escribi mal gracias.



  5. Para barsoto:
    Para hacer eso tienes que hacer NAT al puerto de el cliente/servidor, por ejemplo, si vas a usar el puerto 114 tienes que hacer NAT al puerto 114 y dirigirlo a tu ip local.
    Espero haber resuelto tus dudas.
    P.D: Me se ha olvidado que tienes que poner el el campo de ip de tu pc tu direccion local y el de el trabajo la ip publica de tu pc.



  6. en la aplicacion cliente al winsock tienen que cambiarle de localport a remoteport

    el primero dejarlo vacio y le colocan 888 a remoteport



  7. con el comment que dejaste de cambiarla a la aplicacion de local port a remote port, se resuelve el problema de el primer coment, del txt2?



  8. COmo se puede aumentar el time up que trae el winsock control ?????



  9. no me corre el cliente/sevidor
    y el profe esta jode ke jode
    ayuda
    no le entiendo



  10. No funciona.alguien ha encontrado algo que funcione??



  11. quisiera saver mas hacerca de programar un cliente servidor



  12. Amigos en aplicacion cliente deben detatallar en remotehost la ip del servidor y en remoteport el puerto con el que se van a comunicar, las demas funciones quedan a su imaginacion, en la aplicacion servidor deben crear un winsock con indice cero que se encuentre en escucha Ejm. winsock1(0).listen, cuando un cliente envia la solicitud de conecion deben crear una instancia nueva del winsock1 para que este se haga cargo del cliente respectivo mientras la instancia padre queda a la escucha de nuevas solicitudes y asi susecivamente ejm. load winsock1(1).acept(requestID) la nueva instancia posee en sus propiedades la direccion ip del cliente que se a conectado y con la instancia respectiva se atiende las solicitudes del respectivo cliente, ojo la instancia padre debe contener en remote port el mismo numero de puerto que el de las aplicaciones cliente, espero haberles ayudado aunque un poco tarde



  13. Yo cometí un error estúpido por lo que me surgía un error al enviar los datos desde el cliente: no le había dado clic en escuchar en el caso del servidor.

    Jejejeje.



  14. Buenas, tengo un gran problema. La cuestion es que intento tener una aplicacion servidor y varias clientes. Le hago la creacion de instancias, pero a medida que las maquinas se van conectando, solamente la ultima es la que queda conectada. Como hago para que TODAS trabajen de manera simultanea recibiendo el mensaje que envia servidor.

    Es urgente, si pueden colaborarme se los agradezco.
    Camilo



  15. Para que funcion lo de las multiinstancias debe buscar la manera de que todas las instancias nuevas que se vayan a crear tambien tengan programadas las funciones listen, las funciones data arrival y las de data send. En este momento no te puedo ayudar en como hacer esto ya que ya hace un tiempo que no he vuelto a programar en VB pero ahora es que estoy volviendo a esas andanzas pero hay cosas que aun no recuerdo bien asi que lo dejo en tus manos, pero el problema se basa en que las nuevas instancias no estan programadas.

    espero te sea util.

    Visiten http:es.geocities.com/skiteamsa/cvonline.htm para probar el nuevo Castlevania Online Symphony of the Time



  16. YO TENGO LA SOLUCION,
    LUEGO DE PROBAR MUCHO CON EL WINSOCK
    LOGRE HACERLO ANDAR, LO PRINCPAL
    ES ASEGURARSE QUE WINDOWS NO ESTE
    USANDO EL PUERTO QUE QUIEREN USAR, PARA
    FIJARCE ENTREN A MS-DOS Y ESCRIBAN:
    NETSTAT -A
    Y LES FIGURARA LA LISTA DE PUERTOS ABIERTOS
    QUE TIENE SU PC, LUEGO PRUEBEN, LO MAS
    PROBABLE ES QUE LES FUNCIONE UNA SOLA VEZ Y TENGAN QUE CAMBIAR
    DE PUERTO, ESTO SUCEDE PORQUE NO HAN CERRADO EL PUERTO,
    DEBEN HACER ALGO ASI:

    Private Sub FORM_LOAD()
    If WINSOCK.State sckClosed Then _
    WINSOCK.Close
    END SUB

    ESO HARA QUE SI EL PUERTO ESTA ABIERTO LO CIERRE,
    YO CREE UNA APLICACION TIPO MSN PARA CHATEAR, SI
    QUIEREN LES PASO MIS CODIGOS FUENTE Y MIS APPS
    PARA QUE LAS PRUEBEN POR CONSULTAS.


    ESPERO LES SIRVA.
    SALUDOS



  17. a mi no me deja conectar, me dice address already in use uando le pongo el puerto al cliente



  18. Para Camilo.
    Para que el mensaje se envie a todos instala el ultimo Service Pack del Visual Studio 6y con eso debe funcionar



  19. Si alguien mas necesita ayuda con esto puede contactarme en:



  20. Para Todos:
    La solucion a este problema de no conectarse es que Uds. tienen que cambiar el localport por el remoteport y listo en las propiedades del Winport del Ciente. Si desean comunicarse con migo mi msn es [email protected] ; soy programador web en php mysql y visual 6. ok saludos y mucha suerte.



  21. kisiera conectarme a otra pc para bajar un archivo, todo lo ke esta eskrito aki me sirve para conectarme y bajarlo o hay otra metodo???? ayudenme urgente...



  22. en mi web les explica bien como hacerlo,
    solo deben registrarse y acceder a la parte de tutoriales.
    saludos.

    http://www.exechapur.com.ar/



  23. Gracias de gran ayuda, y lo único que hay que cambiar es el remoteport en la aplicacion cliente, además en la aplicacion del servidor colocar una linea opcional ya sea agregada a un boton para cerrar el puerto Winsock1.Close



  24. Necesito cambiar la IPLocal del servidor ya que tengo dos tarjetas de red y quiero decirle porque red ha de estar escuchando.

    La propiedad IPLocal es de solo lectura, pero puedo cambiarla de alguna manera ??

    Un saludo y gracias

agregar comentario


Se permiten las etiquetas HTML , y

. Si ingresa alguna direcci?n web o direcci?n de email ser?n convertidos en enlaces autom?ticamente.





publicidad

API DE FACEBOOK
GOOGLE CALENDAR API
GOOGLE MAPS API