Social Icons

viernes, 28 de marzo de 2014

Como programar en red con visual basic 6 - Chat cliente/servidor

Hola estimados lectores.

En esta entrada, aprenderemos como programar una chat cliente/servidor, con el cuál daremos nuestros primeros pasos con las funciones de red que nos proporciona visual basic 6, a través de su control Winsock.

Configurando el sistema servidor

Este sistema servidor será el servidor para un chat entre cliente y servidor (Programa 02)

Antes debemos saber lo siguiente:
Listen

 Pone a la aplicación en espera de una conexión de un cliente, cuando el winsock recibe un intento de conexión, se produce el evento connectionRequest, entonces en este método se debe llamar al evento Accept para aceptar la conexión entrante. Se hace notar que un winsock solo pude aceptar una conexión, o sea sería conexión de computadora a computadora. No es muy común que nosotros querramos hacer aplicaciones en las que nuestro servidor solo atienda a una computadora cliente, sino que atienda a varias. Para hacer que nuestro servidor acepte a varias conexiones a la vez, lo que hacemos es establecer un winsock principal totalmente a la espera, y que éste al recibir una conexión entrante cargue otro winsock y le asigne la nueva conexión, mientras nuestro winsock principal sigue recibiendo más conexiones y asignándolas a nuevos winsocks.

El winsock original debe establecerse su propiedad index = 0  para que este winsock sea el inicial de un vector de winsocks. Cada winsock nuevo que éste cree se irá almacenando en el vector.

Winsock original
(esperando conexiones)
Winsock creado por el original
(atendiendo cliente 1)
Winsock creado por el original
(atendiendo cliente 2)
Espacio libre para winsock


LocalPort

Propiedad que debe establecerse en el servidor para que acepte conexiones de los clientes. Es de lectura y escritura, además está en disponible en tiempo de diseño y ejecución.
Ejemplo: Winsock1.LocalPort
ConnectionRequest

Evento que se activa cuando el servidor detecta que hay un cliente queriendo conectarse a él. Al aceptar la conexión con el método Accept, las propiedades RemoteHostIP guarda la IP del cliente y RemotePort guarda el puerto utilizado por el cliente.
Accept

Esta propiedad es para aceptar la conexión entrante.
Ejemplo: winsock1.accept RequestID
Dataarrival

Es cuando el servidor está recibiendo mensajes del cliente



GetData

Recibe el mensaje que activó a DataArrival, y lo guarda en una variable y borra lo que se recibió, ya que se queda almacenado en el buffer del sistema(memoria temporal)
Ejemplo:  dim datos as string
                 Winsock1.GetData datos
SendData

Para mandar mensajes al cliente, que puede ser texto o código binario, en caso de mandar archivos.
Ejemplo: winsock1.SendData “Mensaje”
State

Propiedad del winsock que nos permite saber el estado de la conexión, valores que puede devolver:



Valor               Constante                   Estado

0                      sckClosed                   Cerrado
1                      sckOpen                     Abierto
2                      sckListening               Escuchando
3                      sckConnectionPending          Conexión pendiente
4                      sckResolvingHost      Resolviendo Host
5                      sckHostResolved       Host resuelto 
6                      sckConnecting                       Conectando
7                      sckConnected             Conectado
8                      sckClosing                  Cerrando la conexión
9                      sckError                      Ha detectado un error

Entramos a lo que es el desarrollo de un sistema servidor, el cual nos ayudará a recibir a un cliente, y poder chatear con él.

Creamos lo siguiente:

-          5 etiquetas (label1, label2, label3, label4 y label5), label1 en caption “Esta es mi ip”, label2 en caption “Nombre de mi computadora”, label3 en caption “Mensaje recibido”, label4 en caption “Escribir mensaje”, label5 en caption “Estado de la conexión”.

-          5 cuadros de texto

-          3 botones de comando (command1, command2, command3), command1 en caption  “Cual es mi ip ?“, command2 en caption “Cual es mi nombre“, command3 en caption “Enviar”.

-          1 timer (timer1)
-          1 winsock (winsock1)

Debe quedar mas o menos así:





Primero configuramos la propiedad “LocalPort” del winsock1 y la ponemos en el puerto “10112”, y el timer en la propiedad interval establecemos “1”.

Ahora a programar:

Lector: Programa el command1 y command2, que ya lo hicimos en el ejemplo anterior


Debemos programar el evento LOAD del formulario:

Private Sub Form_Load()
  Winsock1.Listen   ‘El sistema se pone a la espera de conexiones
End Sub


Programando el command3 “Enviar”, que sirve para enviar mensajes al cliente

Private Sub Command3_Click()
  Winsock1.SendData Text4.Text  'Envía mensaje al cliente
  Text4.Text = ""
End Sub


Programando el evento ConnectionRequest para saber cuando un cliente se trata de conectar y aceptar la conexión:

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
  Winsock1.Close                        ‘cierra el winsock
  Winsock1.Accept requestID     ‘Acepta la conexión
End Sub

Programando el evento DataArrival, para recibir los mensajes del cliente:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim datos As String    'Declaramos variable cadena
  Winsock1.GetData datos 'Obtenemos el mensaje recibido y lo pasamos a la variable datos
  Text3.Text = ""        'Limpiamos el text3
  Text3.Text = datos     'Pasamos el mensaje recibido al text3
End Sub

Programando el timer1, para que aparezca el estado de conexion al instante.

Private Sub Timer1_Timer()
  If Winsock1.State = 0 Then
    Text5.Text = "Conexión cerrada"
  End If
  If Winsock1.State = 7 Then
    Text5.Text = "Conexión establecida"
  End If
  If Winsock1.State = 8 Then
    Text5.Text = "Cerrando la conexión"
  End If
  If Winsock1.State = 9 Then
    Text5.Text = "Ha ocurrido un error en la conexión"
  End If
  If Winsock1.State = 2 Then
    Text5.Text = "Esperando una conexión"
  End If
End Sub

Con esto el sistema servidor está listo para recibir a un cliente.
Configurando el sistema cliente

Entramos ya de plano a configurar un sistema cliente que se conectará a un sistema servidor que también haremos, este sistema funcionará para conectarte al sistema servidor que esté instalado en la misma máquina que en el sistema cliente, o al sistema servidor que esté instalado en otra computadora en red o en internet.

Este sistema cliente será el cliente para un chat entre cliente y servidor (Programa 03)

Antes debemos saber lo siguiente:
Close

Propiedad del winsock que permite cerrar el control winsock para establecer una nueva conexión, esto siempre se debe de hacer antes de invocar la propiedad connect.
Ejemplo: winsock1.close
Connect

Propiedad del winsock que permite establecer una conexión con otro programa, en la misma computadora, en la red, o en internet.
Ejemplo: winsock1.connect “148.208.196.5”, 10112

Creamos lo siguiente:

-          4 etiquetas (label1, label2, label3, label4), label1 en caption “Conectarme a la ip”, label2 en caption “Mensaje recibido”, label3 en caption “Escribir mensaje”, label4 en caption “Estado de la conexión”.

-          4 cuadros de texto

-          2 botones de comando (command1, command2), command1 en caption  “Conectar“, command2 en caption “Enviar“.

-          1 timer (timer1)

-          1 winsock (winsock1)


Se debe ver algo como esto:



Configuramos el timer, en la propiedad interval ponemos un “1”

Programemos el command1 “Conectar”

Private Sub Command1_Click()
Winsock1.Connect Text1.Text, 10112  ‘Nos conectamos a la ip especificada por medio  del 
                                                                ‘puerto 10112
End Sub


Ahora programamos el control timer1 con los eventos más destacados

Private Sub Timer1_Timer()
  If Winsock1.State = 0 Then
    Text4.Text = "Conexión cerrada"
  End If
  If Winsock1.State = 7 Then
    Text4.Text = "Conexión establecida"
  End If
  If Winsock1.State = 8 Then
    Text4.Text = "Cerrando la conexión"
  End If
  If Winsock1.State = 9 Then
    Text4.Text = "Ha ocurrido un error en la conexión"
  End If
End Sub
Programando command2 “Enviar”

Private Sub Command2_Click()
  Winsock1.SendData Text3.Text
  Text3.Text = ""
End Sub


Programando evento DataArrival

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim datos As String    'Declaramos variable cadena
  Winsock1.GetData datos 'Obtenemos el mensaje recibido y lo pasamos a la variable datos
  Text2.Text = ""        'Limpiamos el text2
  Text2.Text = datos     'Pasamos el mensaje recibido al text2
End Sub


Ya con esto podemos intentar hacer una conexión entre cliente y servidor, por medio de la ip. Si queremos conectarnos al programa servidor que está en nuestra PC, basta con escribir la ip “127.0.0.1” y conectar y se hace la conexión.

No hay comentarios.:

Publicar un comentario

 
Blogger Templates