You are on page 1of 71

CURSO PARA CREAR APLICACIONES EN RED CON VISUAL BASIC 6.

CUARTA VERSIÓN DEL CURSO

Creador del curso: Ing. Martín Campos Quintero


Correo de contacto: martincamposquintero@gmail.com
www.sisadmic.tk

Este curso se actualiza cada mes, así que si deseas conseguir la última versión
Del curso, comunícate conmigo o puedes adquirirlo desde nuestra página de
Internet en la opción compra, puedes solicitarlo.

Para sugerencias comunícate a mi correo y hazme saber que más cosas te


Gustaría que tuviera este curso, para de esta manera irlo mejorando cada vez
Más.
Introducción

El control winsock es el control que visual basic nos proporciona para poder realizar
nuestras propias aplicaciones cliente - servidor. Con este control podremos realizar
programas que se puedan comunicar con otros programas nuestros, en la misma
computadora, o incluso en otra computadora (esta es la opción que a la mayoría nos
interesa).

Los programas que se pueden realizar con este control son variados, como puede ser un
servidor web, un sistema de control de acceso, sistema para cybers, sistema para control de
personal, troyanos, sistemas de asistencia remota. En fin programas para buenos propósitos
y programas para no muy buenas personas :D . Nosotros nos basaremos en programas para
buenos propósitos. Lo más interesante del control winsock, es que además de servir para
comunicar nuestras aplicaciones en la misma máquina o en una red local, también nos sirve
para comunicar nuestras aplicaciones a través de internet. Con esto te quiero decir que
podrás hacer tu propio chat y podrás divertirte usándolo con tus amigos a través de internet,
o hacer diversas aplicaciones para trabajar a través de internet.

Cabe destacar que TODAS las aplicaciones que se muestran y que se codifican en este
curso funcionan en RED DE AREA LOCAL e igualmente por INTERNET (Un poco más
lentas pero funcionan perfectamente).

Comenzamos con el curso. Y les pido de favor que no cambien ningún crédito en él puesto.
Primeramente, claro después de haber instalado visual basic. Debemos buscar el control
Microsoft winsock control en el menú “proyecto->componentes”, activar su casilla y pulsar
el botón “Aceptar”.

El control tiene una apariencia como la siguiente figura, y al agregarlo aparecerá en la barra
de controles.

Hecho esto procedemos a realizar nuestra primera aplicación


Primera aplicación: saber ip y nombre de nuestra computadora (programa 01)

Para esto abrimos visual basic 6.0 y creamos lo siguiente

- 2 etiquetas (label1 y label2), label1 en caption “Esta es mi ip”, label2 en caption


“Nombre de mi computadora”
- 2 cuadros de texto (text1 y text2)
- 2 botones de comando (command1 y command2), command1 en caption “Cual es
mi ip?”, command2 en caption “Cual es mi nombre”.
- 1 winsock (winsock1)

Se debe ver algo como esto:

Hecho esto programemos el command1 “Cual es mi ip?”

Private Sub Command1_Click()


Text1.Text = Winsock1.LocalIP ‘Obtiene la ip de la computadora
End Sub

Y ahora programemos el command2 “Cual es mi nombre”

Private Sub Command2_Click()


Text2.Text = Winsock1.LocalHostName ‘Obtiene el nombre de la computadora
End Sub

Y ahora a correr nuestra aplicación y pulsar en los dos botones, y la ejecución debe ser algo
como esto:
Claro la ip que están viendo es la que tenía yo cuando ejecuté el programa, y el nombre que
ven es el nombre de mi computadora, el código está muy chico y explicadas sus lineas.
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 Winsock creado por Winsock creado por Espacio libre
(esperando conexiones) el original el original para winsock
(atendiendo cliente 1) (atendiendo cliente 2)

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.
Otras propiedades

BytesReceived

Propiedad de solo lectura que almacena la cantidad de datos recibidos. Está disponible sólo
en tiempo de ejecución.
Ejemplo: winsock1.BytesReceived

PeekData

Este método es similar a GetData, lo único que varía, es que el GetData elimina los datos
recibidos del buffer, y el PeekData no los elimina.

SendProgress

Este método se produce mientras se están enviando datos. Pasa como parámetros los bytes
enviados desde la última vez que se activó el evento (bytesEnv) y los bytes que esperan a
ser enviados en el buffer de transmisión (bytesRest)

Ejemplo: winsock1_SendProgress (bytesEnv As Long, bytesRest As Long)

SendComplete

Se produce cuando en una operación de envío de datos, se han enviado todos.

Ejemplo: winsock1_SendComplete()

Error
Se produce siempre que ocurre un error en los procesos de segundo plano (por ejemplo, un
fallo al conectar o un fallo al enviar o recibir en segundo plano). Pasa como parámetros el
código de error, la descripción del error, el scode del error, el origen del error, y un
booleano para cancelar o aceptar el que presente un cuadro de dialogo con el aviso de error.

Winsock1_Error(número As Integer, descripción As String, scode As Long, origen As


String, archivoAyuda as String, contextoAyuda As Long, cancelarVista As Boolean)
El código de error puede tomar estos valores:

Constante Valor Descripción

SckOutOfMemory 7 Sin memoria


SckInvalidPropertyValue 380 El valor de la propiedad no es válido
SckGetNotSupported 394 No se puede leer la propiedad
SckSetNotSupported 383 La propiedad es de sólo lectura.
SckBadState 40006 Protocolo o estado de conexión incorrecto para
La solicitud o la transacción
requerida.
SckInvalidArg 40014 El argumento que se pasó a una función no
estaba en el formato correcto o en el intervalo
especificado.
SckSuccess 40017 Correcto
SckUnsupported 40018 Tipo Variant no aceptado.
SckInvalidOp 40020 La operación no es válida en el estado actual.
SckOutOfRange 40021 El argumento está fuera del intervalo.
SckWrongProtocol 40026 Protocolo erróneo para la solicitud o la
transacción requerida.
SckOpCanceled 10004 Se canceló la operación.
SckInvalidArgument 10014 La dirección solicitada es una dirección de
multidifusión, pero el indicador no está
activado.
SckWouldBlock 10035 El socket es no bloqueante y la
operación especificada se bloqueará.
SckInProgress 10036 Se está efectuando una operación de Winsock
bloqueante.
SckAlreadyComplete 10037 Se completó la operación. No se están
efectuando operaciones bloqueantes.
SckNotSocket 10038 El descriptor no es un socket.
SckMsgTooBig 10040 El datagrama es demasiado grande para
el búfer y se truncará.
SckPortNotSupported 10043 El puerto especificado no es compatible.
SckAddressInUse 10048 Dirección en uso.
SckAddressNotAvailable 10049 La dirección no está disponible en la máquina
local.
SckNetworkSubsystemFailed 10050 Error en el subsistema de red.
SckNetworkUnreachable 10051 El host no puede encontrar la red en este
momento.
SckNetReset 10052 Expiró el tiempo de espera de la conexión antes
de establecer SO_KEEPALIVE.
SckConnectAborted 10053 La conexión se ha cancelado al sobrepasar el
tiempo de espera o por otro error.
SckConnectionReset 10054 La conexión se ha restablecido desde el lado
remoto.
SckNoBufferSpace 10055 No hay espacio disponible en el búfer.
SckAlreadyConnected 10056 El socket ya está conectado.
SckNotConnected 10057 El socket no está conectado.
SckSocketShutdown 10058 El socket se ha desactivado.
SckTimedout 10060 Se ha sobrepasado el tiempo de conexión.
SckConnectionRefused 10061 Se ha forzado el rechazo de la conexión.
SckNotInitialized 10093 Es necesario llamar primero a WinsockInit.
SckHostNotFound 11001 Respuesta autorizada: host no encontrado.
SckHostNotFoundTryAgain 11002 Respuesta no autorizada: host no encontrado.
SckNonRecoverableError 11003 Errores no recuperables.
SckNoData 11004 Nombre válido; no hay registro de datos del
tipo solicitado.
Validaciones de envío de mensajes y conexión

Para tener un programa muy bien desarrollado y que no cause errores cuando las terminales
destino se caigan, debe hacerse una buena validación en el envío de mensajes a terminales,
esto es, si no se encuentra activa la terminal, no enviarle ningún tipo de mensajes hasta que
esta esté activa. Esto se consigue con la propiedad “state”, tomamos algunos valores de
esta propiedad para validar que la máquina esté activa.
Los valores que nos interesan de esta propiedad son los siguientes

Valor Constante Estado

0 sckClosed Cerrado
7 sckConnected Conectado

Ejemplo de envío de mensaje erroneo:

Winsock1.senddata “Hola como estás”

Este envío de mensaje funciona muy bien cuando la terminal destino está conectada, pero si
se desconecta la terminal y mandamos un mensaje a ella, nuestra aplicación se traba.
Entonces debemos utilizar la siguiente estructura para que nuestra aplicación no sufra
ningún error de este tipo

Ejemplo de envío de mensaje correcto:

If winsock1.state=7 then
Winsock1.senddata “Hola como estás”
endif

Ahora procedemos a validar la conexión, esto causa error si tenemos un botón de conectar y
pulsamos conectar y la aplicación se conecta con el servidor, muy bien hasta ahora, pero
que pasa si de casualidad se nos ocurre nuevamente pulsar el botón conectar?, nuestra
aplicación sufre un error. Ahora a corregirlo.

Ejemplo de conexión erronea:

Winsock1.connect “192.168.1.6”, 10112

Funciona pero falla con la explicación que te di anteriormente

Ejemplo de conexión correcta:

If winsock1.state<>7 then
Winsock1.close
Winsock1.connect “192.168.1.6”, 10112
endif
Como crear aplicaciones que aceptan varias conexiones?

Para crear este tipo de aplicaciones, se olvida el concepto 1 a 1 para convertirse en un


concepto 1 a muchos, para lograr esto en nuestras aplicaciones, tenemos que pensar de la
siguiente manera:

En lugar de hacer que nuestro winsock del servidor reciba una conexión y se cierre:

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)


Winsock1.Close ‘cierra el winsock
Winsock1.Accept requestID ‘Acepta la conexión
End Sub

Lo que debemos hacer es que nuestro winsock reciba la petición y cree otro winsock que
aloje esa conexión, y él siga esperando más conexiones, esto lo conseguimos de la siguiente
forma:

Primero seleccionamos nuestro winsock y en la propiedad index ponemos el valor de “0”,


con esto indicamos que será una matriz unidimensional o un vector de winsocks, ahora al
recibir una petición de conexión se utiliza este código:

Antes que nada declaramos una variable que va a llevar el conteo de las conexiones
establecidas

Public contador_conexiones as integer

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)


Load Winsock1(contador_conexiones) 'Se crea un nuevo winsock en el vector
Winsock1(contador_conexiones).Close 'Se cierra el winsock creado
Winsock1(contador_conexiones).Accept requestID 'El winsock creado acepta la conexión
entrante
contador_conexiones = contador_conexiones + 1 'Aumentamos nuestra variable de
conexiones
End Sub
Minichat que acepta varias conexiones (programa 04)

Ahora entraremos a la programación de un minichat que aceptará varias conexiones. El


anterior solo aceptaba una conexión, que era 1 solo servidor con 1 solo cliente, ahora será 1
solo servidor con x número de clientes.

Viendo este código, se podrán hacer muchas otras aplicaciones similares, éste minichat se
puede decir que es la base para poder crear sistemas de administración, ya sea de cybers,
control de acceso, en el que se involucran varias computadoras clientes.

El minichat en lugar de usar el puerto 10112 como el anterior, usará el puerto 80 para
asegurar de que también podrá usarse a través de internet.

El código tiene explicación linea por linea.

En un formulario, que actuará como menú, se crean los siguientes submenús


Debe verse algo así:

Y entonces programaremos los menús:

Private Sub mcliente1_Click()


cliente.Show 'llama al formulario "cliente2"
End Sub

Private Sub mcliente2_Click()


cliente2.Show 'llama al formulario "cliente2"
End Sub

Private Sub salir_Click()


Unload Me
End Sub

Private Sub servidor1_Click()


servidor.Show 'llama al formulario "servidor"
End Sub

Entonces creamos un nuevo formulario que se llame “servidor”, al cual le agregaremos:


- 1 listbox
- 2 textos (text2 y text1)
- 1 botón de comando (command2), en caption “Enviar”
- 3 etiquetas (label1, label2, label5), label1 en caption “Estado”, label5 en caption
“Mi ip es:”
- 1 timer (timer1), timer1 en interval = 1
- 1 winsock(winsock1), winsock1 en index = 0
Ahora coloca el siguiente código fuente

Public contador_conexiones As Integer


Private Sub Delay(lngCentSeg As Long)
Dim TimeEnd As Single
TimeEnd = Timer + lngCentSeg / 100
Do While TimeEnd > Timer
DoEvents
Loop
End Sub

Private Sub Command2_Click()


Dim enviar As String
enviar = Text2.Text
Dim c As Integer
c=1
'Ciclo para enviar datos a todos los clientes
While c < contador_conexiones
Call Delay(1)
If Val(Winsock1(c).State) = 7 Then 'Si la conexión está establecida con el cliente
Winsock1(c).SendData enviar 'Enviamos datos al cliente
End If
c=c+1
Wend
List1.AddItem "yo: " & enviar ' Imprimimos en nuestra pantalla el mensaje mandado
Text2.Text = ""
End Sub

Private Sub Form_Load()


Winsock1(0).LocalPort = 80 'Establecemos el puerto que se usará
Winsock1(0).Listen 'Pone a la escucha el winsock principal
contador_conexiones = 1
Text1.Text = Winsock1(0).LocalIP ' Obtenemos la ip de nuestra computadora
End Sub

Private Sub Timer1_Timer()


If Winsock1(0).State = 2 Then 'Si el winsock está a la espera de conexiones
Label2.Caption = "Esperando una solicitud de conexión"
End If
If List1.ListCount > 0 Then
List1.ListIndex = List1.ListCount - 1 'Se selecciona el último mensaje recibido
End If
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Load Winsock1(contador_conexiones) 'Se crea un nuevo winsock en el vector
Winsock1(contador_conexiones).Close 'Se cierra el winsock creado
Winsock1(contador_conexiones).Accept requestID 'El winsock creado acepta la conexión
entrante
contador_conexiones = contador_conexiones + 1 'Aumentamos nuestra variable de
conexiones
End Sub

Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)


Dim datos As String
Winsock1(Index).GetData datos 'Obtenemos los datos que haya enviado x cliente
List1.AddItem Winsock1(Index).RemoteHost & datos 'Ponemos en pantalla el mensaje
recibido
End Sub

Ahora crea un nuevo formulario el cual se llamará “cliente”, al cual le agregarás:


- 1 listbox
- 2 etiquetas (label1, label3), label1 en caption “IP”, label3 en caption “Mi IP es:”
- 3 textos (text2, text3, text1)
- 2 botones de comando (command2, command1), command2 en caption “Enviar”,
command1 en caption ”Conectar ”.
- 1 winsock (winsock1)
- 1 timer (timer1), timer en interval = 30
Ahora agrega el siguiente código:

Private Sub Command1_Click()


If Command1.Caption = "Conectar" Then
Winsock1.Connect Text3.Text, 80 'Conectamos mediante el puerto 80
Else
Unload Me 'Cerramos el formulario
cliente.Show 'Lo volvemos a abrir
End If
End Sub

Private Sub Command2_Click()


If Winsock1.State = 7 Then 'Si la conexión está establecida
Dim enviar As String
enviar = Text2.Text
Winsock1.SendData Winsock1.LocalHostName & ": " & enviar 'Enviamos un mensaje
como el siguiente: nombre_computadora:mensaje
List1.AddItem "yo" & ": " & enviar 'Imprimimos en nuestra propia pantalla el mensaje
enviado
Text2.Text = ""
Else
MsgBox ("Error, al enviar mensaje") 'Se manda un mensaje de error si la conexión no
está establecida
End If
End Sub

Private Sub Form_Load()


Text1.Text = Winsock1.LocalIP 'Obtenemos nuestra propia IP
End Sub

Private Sub Timer1_Timer()


If Winsock1.State = 7 Then 'Si la conexión está establecida
Command1.Caption = "Desconectar"
End If
If Winsock1.State = 0 Then 'Si la conexión está cerrada
Command1.Caption = "Conectar"
End If
If List1.ListCount > 0 Then
List1.ListIndex = List1.ListCount - 1 'Se selecciona el último mensaje recibido
End If
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)


Dim datos As String
Winsock1.GetData datos 'Obtenemos los datos que haya enviado el servidor
List1.AddItem "Servidor: " & datos 'Ponemos en pantalla el mensaje recibido
End Sub
Crea un nuevo formulario, que se llamará “cliente2”, y haz lo mismo que en el cliente1.

Ahora procedemos a ejecutar nuestro programa, y se debe ver de la siguiente manera:


Como obtener datos de la base de datos del servidor?

En algunas ocasiones esta es la parte más interesante de los programas cliente – servidor, la
capacidad de poder obtener los datos de una base de datos que no está alojada localmente.
Esta parte de las aplicaciones cliente – servidor es la más deseada por quienes desean
desarrollar aplicaciones de este tipo. Ahora les explicaré la forma de obtener datos,
modificarlos, eliminarlos, guardarlos y visualizarlos. Querian más?

Primeramente para guardar datos, el cliente debe enviar un mensaje diciendo al servidor
que desea guardar datos, entonces el servidor identifica el mensaje y procede a guardar
todos los datos que el cliente le envió junto con dicho mensaje.

enviar_linea = "/guarda_info_docente:" & Text1.Text & "," & Text2.Text & ";”
If Winsock1.State = 7 Then
Winsock1.SendData enviar_linea
endif

Hago notar que cada campo lo separo por una “coma ( , )” y al último pongo un “punto y
coma ( ; )”, esto es para que el servidor identifique en que campo guardar cada dato y
cuando el servidor encuentra un “punto y coma” significa que ya no hay nada más que
buscar en el mensaje. El servidor busca en el mensaje letra por letra es por esto que se le
debe indicar hasta cuando deje de buscar.

If Left(datos, 21) = "/guarda_info_docente:" Then


Docentes.recordset.addnew
While (Mid(aux, c, 1) <> ",")
palabra = palabra & Mid(aux, c, 1)
c=c+1
Wend
docentes.Recordset.no_tarjeta= palabra

c=c+1
palabra = ""

While (Mid(aux, c, 1) <> ";")


palabra = palabra & Mid(aux, c, 1)
c=c+1
Wend

docentes.Recordset.nombre = palabra

docentes.UpdateRecord
docentes.Refresh
endif

Este código es donde el servidor decodifica el mensaje, y guarda los datos, y es lo mismo
para modificar información, sólo que en lugar de “addnew”, se coloca “edit”
Para pedir datos al servidor para visualizarlos, el cliente le hace una petición al servidor:

If winsock1.state = 7 then
Winsock1.SendData "/verifica_docente:" & Text1.Text
Endif

Entonces el servidor debe hacer una búsqueda en su base de datos y al encontrar al docente
mandarle los datos al servidor:

enviar_linea = "/ info_docente:" & base_de_datos.recordset.no_tarjeta & "," &


base_de_datos.recordset.nombre & ";”

Y el cliente debe decodificar los datos y mostrarlos en su pantalla.

Puedes ver el código fuente que te incluyo para que te sea más fácil comprender en el
“PROGRAMA 05”
Como puedo bloquear y desbloquear una PC cliente desde el servidor?

Para poder hacer esto, es necesario ejecutar una rutina que cada segundo esté actualizando
la pantalla cliente para indicarle que siempre se mantenga al frente sobre cualquier
aplicación para que la aplicación cliente esté bloqueando el uso de cualquier programa en la
pc en que se encuentra.

Para bloquear o desbloquear el cliente desde el servidor, basta con mandar orden de
bloqueo o desbloqueo al cliente, quien reconoce dichas órdenes y procede a ejecutarlas.

Para bloquear tenemos la propiedad del cliente “windowstate” en maximizado, para


desbloquear lo ponemos a “normal” y disminuimos el largo y ancho de la pantalla.

Además debemos aplicar a la propiedad “BorderStyle” del formulario a “0-None”

Puedes ver el código fuente que te incluyo para que te sea más fácil comprender en el
“PROGRAMA 06”
Como puedo realizar una conexión ODBC con una base de datos en un servidor?

Las conexiones ODBC son realizadas por el sistema operativo, y se encargan de realizar
una conexión entre nuestra máquina y una base de datos que se encuentra en otra
computadora. Esta conexión nos facilita que si hacemos una aplicación que funcione en
nuestra propia computadora, también podrá funcionar en red, sin programar nada más, sino
solo cambiar la dirección donde se encuentra la base de datos.

Ahora veremos la forma de configurar una base de datos con la configuración ODBC y
veremos código de ejemplo de cómo utilizar esta conexión.

Antes de comenzar debemos colocar la base de datos en el servidor, en la unidad C. En este


caso el PC que utilizamos como servidor fue \\clara o de igual manera también podemos
utilizar la dirección IP de la computadora \\192.168.0.1

CONFIGURANDO LA CONEXIÓN

Para esto vamos al panel de control, entramos a herramientas administrativas

Ejecutamos el programa Orígenes de datos (ODBC)


Se abre una ventanita donde vamos a pulsar el botón “Agregar”

En la siguiente pantalla seleccionamos el controlador que en este caso es Microsoft Access


Driver
Y pulsamos Finalizar

En la siguiente pantalla indicamos en el cuadro nombre del origen de datos y en


descripción, la palabra “conexion”, entonces pulsamos el botón “Seleccionar”

Ahora seleccionamos la base de datos “BD_SAD.mdb” que se encuentra en la unidad “C” y


pulsamos “Aceptar” y pulsamos el botón “Red”, en el cual indicamos la dirección IP del
servidor o el nombre del mismo, seguido de la unidad “C”, que es en la cual se encuentra la
base de datos
Pulsamos “Finalizar” y se establece la conexión. Seguido de esto seleccionamos la base de
datos y pulsamos “Aceptar”.

En la pantalla nos muestra ya la base de datos como: “C:\BD_SAD.mdb”, quiere decir que
hemos configurado correctamente, pulsamos el botón “Aceptar” y desde ahora podremos
hacer uso del sistema.

Nota: El proceso de configuración de la conexión se debe realizar en cada equipo. Y cabe


destacar que la unidad C del equipo servidor debe estar compartida, además de que el
firewall si es que lo tiene debe configurarse para que permita esta conexión.
Ahora que hemos configurado nuestra conexión ODBC con la base de datos que se
encuentra en el servidor, podemos pasar a hacer una aplicación de ejemplo.

Abre visual basic y un nuevo formulario. Entonces verifica en menú Proyecto ->
Referencias que esté de la siguiente manera la ventanita que aparezca, de no ser así, activa
los ITEMS.

El principal es Microsoft Remote Data Object 2.0 (o alguna otra versión)

Pantalla del siguiente programa


El siguiente código fuente nos muestra la conexión entre nuestro programa y el ODBC,
donde veremos como consultar, guardar, modificar y eliminar datos.

“PROGRAMA 07”

Private Sub CmdAltas_Click()


'Declaramos las variables que se ocuparán
Dim fun
Dim cn As rdoConnection
Dim en As rdoEnvironment
Dim rdoRS As rdoResultset
Dim SQL As String
Dim duplicado As String
Dim qy As New rdoQuery

'Se establece la conexión, como recordamos en dsname debemos poner el nombre


'que indicamos en ODBC el cual fue conexion
Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsname:="conexion", _
Prompt:=rdDriverCompleteRequired)

'Realizamos la consulta con la base de datos donde le indicamos con FROM que
'Busque en la base de datos la tabla carrera y que ahi en esa tabla busque
'el campo clave_carrera.
With qy
.Name = "BD"
.SQL = "Select * from carrera Where clave_carrera = ? "
.RowsetSize = 1
Set .ActiveConnection = cn
End With

'Indicamos que extraiga todos los registros donde el campo clave_carrera sea
'igual a el valor que indicamos en el combo.
SQL = "Select * from carrera Where clave_carrera='" & Combo.Text & "'"

'Se extraen todos los registros


Set rdoRS = cn.OpenResultset(Name:=SQL, _
Type:=rdOpenStatic, _
LockType:=rdConcurReadOnly, _
Options:=rdAsyncEnable)

'Si se llegó al final quiere decir que no hay registros encontrados, entonces
'procede a registrarse
If rdoRS.EOF = True Then
MsgBox ("no hay repetidos")
'Indicamos la sentencia de introducción de datos a la tabla
SQL = "INSERT INTO carrera " & "(clave_carrera,nombre_carrera)" & "VALUES ('" &
Combo.Text & "', " & "'" & TextDescripcion.Text & "') "

'Ejecutamos la sentencia
With qy
.SQL = SQL
.LockType = rdConcurLock
Set .ActiveConnection = cn
End With

Set rdoRS = qy.OpenResultset(rdOpenForwardOnly, rdConcurReadOnly)


cn.Close
en.Close
TextDescripcion.Text = ""
Combo.Text = ""
fun = comboini()
Else
MsgBox ("si hay registros repetidos")
End If
End Sub

Private Sub CmdBajas_Click()


'Declaramos las variables que se ocuparán
Dim fun
Dim cn As rdoConnection
Dim en As rdoEnvironment
Dim SQL As String
Dim qy As New rdoQuery

'Se establece la conexión, como recordamos en dsname debemos poner el nombre


'que indicamos en ODBC el cual fue conexion
Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsname:="conexion", _
Prompt:=rdDriverCompleteRequired)

'Realizamos la consulta con la base de datos donde le indicamos con FROM que
'Busque en la base de datos la tabla carrera y que ahi en esa tabla busque
'el campo clave_carrera.
With qy
.Name = "BD"
.SQL = "Select * from carrera Where clave_carrera = ? "
.RowsetSize = 1
Set .ActiveConnection = cn
End With
'Indicamos la sentencia de eliminación de datos a la tabla.
SQL = "Delete * From carrera Where clave_carrera='" & Combo.Text & "' "

'Ejecutamos la baja
cn.Execute SQL
cn.Close
en.Close
TextDescripcion.Text = ""
Combo.Text = ""
MsgBox ("Registro Eliminado")
fun = comboini()
End Sub

Private Sub CmdLimpiar_Click()


Combo.Text = ""
TextDescripcion.Text = ""
End Sub

Private Sub CmdModificaciones_Click()


'Declaramos las variables que se ocuparán
Dim fun
Dim cn As rdoConnection
Dim en As rdoEnvironment
Dim rdoRS As rdoResultset
Dim SQL As String
Dim qy As New rdoQuery

'Se establece la conexión, como recordamos en dsname debemos poner el nombre


'que indicamos en ODBC el cual fue conexion
Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsname:="conexion", _
Prompt:=rdDriverCompleteRequired)

'Realizamos la consulta con la base de datos donde le indicamos con FROM que
'Busque en la base de datos la tabla carrera y que ahi en esa tabla busque
'el campo clave_carrera.
With qy
.Name = "BD"
.SQL = "Select * from carrera Where clave_carrera = ? "
.RowsetSize = 1
Set .ActiveConnection = cn
End With

'Indicamos la sentencia de actualización de datos a la tabla.


SQL = " Update carrera set clave_carrera='" & Trim(CStr(Combo.Text)) &
"',nombre_carrera='" & Trim(CStr(TextDescripcion.Text)) & "' Where clave_carrera='" &
Trim(Combo.Text) & "' "
'Ejecutamos la actualización
cn.Execute SQL

cn.Close
en.Close
TextDescripcion.Text = ""
Combo.Text = ""
fun = comboini()
End Sub

Private Sub Combo_Click()


'Declaramos las variables que se ocuparán
Dim fun
Dim cn As rdoConnection
Dim en As rdoEnvironment
Dim SQL As String
Dim qy As New rdoQuery

'Se establece la conexión, como recordamos en dsname debemos poner el nombre


'que indicamos en ODBC el cual fue conexion
Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsname:="conexion", _
Prompt:=rdDriverCompleteRequired)

'Realizamos la consulta con la base de datos donde le indicamos con FROM que
'Busque en la base de datos la tabla carrera y que ahi en esa tabla busque
'el campo clave_carrera.
With qy
.Name = "BD"
.SQL = "Select * from carrera Where clave_carrera = ? "
.RowsetSize = 1
Set .ActiveConnection = cn
End With

'Indicamos que extraiga todos los registros donde el campo clave_carrera sea
'igual a el valor que indicamos en el combo.
SQL = "Select * from carrera Where clave_carrera ='" & Combo.Text & "'"

'Se extraen todos los registros


Set rdoRS = cn.OpenResultset(Name:=SQL, _
Type:=rdOpenStatic, _
LockType:=rdConcurReadOnly, _
Options:=rdAsyncEnable)

'Nos movemos al primer registro extraido, si utilizamos MoveLast nos moveremos


'al último registro de los que se extrajeron.
rdoRS.MoveFirst
TextDescripcion.Text = " "
TextDescripcion.Text = rdoRS!nombre_carrera

LabelUnidad.Caption = Combo.Text

cn.Close
en.Close
End Sub

Function comboini()
'Declaramos las variables que se ocuparán
Dim cn As rdoConnection
Dim en As rdoEnvironment
Dim rdoRS As rdoResultset
Dim SQL As String
Dim qy As New rdoQuery

'Se establece la conexión, como recordamos en dsname debemos poner el nombre


'que indicamos en ODBC el cual fue conexion
Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsname:="conexion", _
Prompt:=rdDriverCompleteRequired)

'Indicamos que extraiga todos los registros de la tabla carrera.


'El asterisco (*) significa que debe extraer todos los registros
SQL = "Select * from carrera"

'Se extraen todos los registros


Set rdoRS = cn.OpenResultset(Name:=SQL, _
Type:=rdOpenStatic, _
LockType:=rdConcurReadOnly, _
Options:=rdExecDirect)

'Es limpiado el combo.


Combo.Clear

'Si se encontraron registros en la consulta SQL entonces entra


If rdoRS.RowCount = -1 Then
'Nos movemos al primer registro encontrado
rdoRS.MoveFirst

'Hacemos un ciclo desde el primer registro encontrado hasta el último


'Esto para almacenar en el combo todos los registros.
'EOF significa End Of File, fin del archivo, o sea el final de todos los
'Registros encontrados.
While rdoRS.EOF = False
Combo.AddItem rdoRS!clave_carrera 'Agregamos el registro al combo
rdoRS.MoveNext 'Nos movemos al siguiente registro
Wend
End If

en.Close
cn.Close
End Function

Private Sub Form_Load()


x = comboini()
End Sub

Con este programa nos podemos dar cuenta de que manera hacer una conexión ODBC con
una base de datos que se encuentra en otra computadora, ya sea en red o por internet.
Como puedo imprimir datos en una impresora local o en red?

Esto de imprimir es tan sencillo como se escucha, lo primero y más básico es tener ya
instalada una impresora local o en red. En sí si la impresora es local o en red, no afecta en
nada a nuestras aplicaciones. Lo importante para nosotros es crear una aplicación donde se
obtengan los datos de la base de datos del servidor. Después realizar las siguientes pautas.

Paso 1. Crear un formulario con dos etiquetas y dos cuadros de texto y un botón de
comando llamado “Imprimir”

Paso 2. Crear un nuevo formulario llamado “form2”

Paso 3. Crear dos etiquetas y dos cuadros de texto, un botón llamado “Seleccionar
Impresora”, y un botón llamado “Proceder a impresión” y un CommonDialog llamado
“cd”, Y además cambiar el color de fondo(Backcolor) del formulario a color blanco así
mismo también las dos etiquetas color de fondo a blanco, como se muestra en la siguiente
figura.

Paso 4. Hacer que el form1 llame al form2 al hacer clic en el botón “Imprimir”.

Paso 5. Hacer que el form2 reciba las líneas escritas en el form1.

Paso 6. Programar el botón “Seleccionar impresora” para que nos cargue las impresoras
configuradas en el sistema.

Paso 7. Programar el botón de “Proceder a imprimir…” con una simple línea que imprimirá
todo el formulario.
Programando aplicación para imprimir datos en impresora local o en red

“PROGRAMA 08”

En el form1 en el botón de “Imprimir” colocar el siguiente código

Private Sub Command1_Click()


Form2.Show
Unload Me
End Sub

En el form2 en el botón de “Seleccionar impresora” colocar el siguiente código

Private Sub Command1_Click()


cd.ShowPrinter
End Sub

En el form2 en el botón de “Proceder a imprimir…” colocar el siguiente código

Private Sub Command2_Click()


Printer.Copies = 1 ' Número de copias que se imprimirán

'Indica la posición en que se imprimirá, 1=vertical y 2=horizontal


Printer.Orientation = 1
Me.PrintForm 'Comienza a imprimir.
End Sub

Si deseas que no aparezcan los botones al imprimir tendrás que hacer que desaparezcan por
cerca de 2 segundos con un control Timer.
Cómo puedo conectarme a una base de datos en Internet desde visual basic?

Para muchos el conectarse a una base de datos que se encuentra en Internet, desde un
programa realizado por ellos mismos, les resulta casi imposible. De hecho la mayoría de los
programadores crecen pensando en que esto no se puede hacer, ya que en las escuelas
jamás nos enseñaron eso, nunca nos dijeron las maravillas que se pueden hacer con los
lenguajes de programación, y digo maravillas porque a mí me resultó casi imposible
también, pero con un buen de investigación y horas y horas de estar frente a la
computadora, me resultó posible y de gran alegría para mi vida, por que ya tenía más de un
año queriendo hacerlo. Gracias a la ayuda de varios foros de programación pude lograrlo,
aunque solamente me dieron las pautas a seguir, yo logré hacerlo y les comparto mi
experiencia. Verán que jamás se arrepentirán de obtener este conocimiento.

Ya te has de estar imaginando, este programa debe ser demasiado pesado ya que para
conectarse a bases de datos en Internet se necesitan cientos de líneas de código, lo digo
porque una vez descargué un código que hacía una conexión a una base de datos en Internet
usando XML y me sorprendí ya que tenía como 1000 líneas de código. Pero algo increíble
es que puedes hacer altas, bajas, modificaciones y consultas sólo con 121 líneas de código.

Está bien ya no ahondo más en lo que me pasó y mejor comienzo a explicarles como se
hace, y en el siguiente tema lo veremos gráficamente.

Para hacer una conexión a una base de datos en Internet, en la cual es una base de datos
MYSQL la que utilizaremos, ya que es una base de datos gratuita. Debemos instalar el
software de ODBC para bases de datos MYSQL llamado “mysql-connector-odbc-3.51.12-
win32.msi” (que incluyo junto con el código fuente de este ejemplo).

Ya instalado dicho software debemos contratar una base de datos gratuita en un servidor de
base de datos MYSQL, porque no estamos dispuestos a gastar más dinero tan solo por
aprender a hacer esto por Internet. Para poder realizar nuestro programa debemos entrar a la
página de Internet http://www.freesql.org en la cual crearemos nuestra base de datos.

En dicha página creamos nuestra base de datos y añadimos campos, hecho esto
comenzaremos a programar nuestra aplicación.

Y para finalizar estaremos más que felices viendo los resultados.


Creando nuestra base de datos en http://www.freesql.org

Al entrar a dicha página nos aparece la siguiente pantalla

1.- En la parte del menú MYSQL, pulsamos create, y nos aparecerá la siguiente pantalla.
2.- En dicha pantalla nos pide:

Username: conexiondb (ustedes pueden poner el nombre de usuario que deseen)


Database Name: conexiondb (Es el nombre de la base de datos a crear)
Email: (Aquí ponen su correo electrónico)
Password: conectar (Pueden poner la password que deseen para su cuenta)
Confirm Password: conectar (Confirmar la contraseña)
Nota: Activar la casilla.

Pulsar el botón “submit”


Debe aparecer la siguiente pantalla si todo estuvo bien

Lo que está seleccionado dice “your database has been created and is now available”. Esto
quiere decir que ya está creada su base de datos.

Ahora debemos crear la tabla y campos en dicha base de datos. Para hacer esto debemos de
ir al menú “PhpMyAdmin”, y nos deberá aparecer la siguiente pantalla, donde teclearemos
nuestro nombre de usuario y contraseña.
Hecho esto nos aparecerá la siguiente ventana

En la parte izquierda de la pantalla, donde dice “Base de datos”, desplegamos la lista, y nos
deben aparecer las siguientes bases de datos:

La que creamos es la de “conexiondb”, el (0), nos indica que tenemos cero tablas creadas
en dicha base de datos.

Para crear una tabla seleccionamos “conexiondb” y damos clic con el botón izquierdo del
ratón, hecho esto veremos la siguiente pantalla.
En esta pantalla ponemos el nombre de la nueva tabla, en este caso pusimos el nombre de
“alumnos”, y el número de campos que tendrá son “2”. Pulsamos el botón “Continuar”.
Vemos la siguiente pantalla

En el primer campo pusimos “numero” Tipo: VARCHAR Longitud Valores: 5


En el segundo campo pusimos “nombre” Tipo: VARCHAR Longitud Valores: 50

VARCHAR significa Variable de tipo carácter, que nos indica que todo lo introducido en
dicho campo, se guardará como texto.

La longitud de los campos, es la cantidad de información que pueden almacenar.

Pulsamos el botón “Grabar”, y nuestros campos estarán creados. Y listos para usarse.
Si todo salió bien veremos la siguiente pantalla:

Hecho esto, podemos comenzar a programar nuestra aplicación para que se conecte con
dicha base de datos.
Programando aplicación para conectarse a la base de datos

Primeramente debemos configurar el control con el que accederemos, para esto en Visual
Basic, vamos al menú Proyecto -> Referencias. Y activamos las casillas siguientes

Hecho esto creamos un control MsFlexGrid, para esto vamos al menú Proyecto ->
Componentes. Y seleccionamos el siguiente control
Ahora que ya tenemos el control lo insertamos en el formulario, junto con los demás
controles, como se ve en la pantalla.
En el control Flexgrid, modificamos las siguientes propiedades:

Nombre: Tabla
Cols: 2
FixedCols: 0
FixedRows: 1
Rows: 1

En el Timer1, modificamos las siguientes propiedades:


Interval: 1000

En el Text1 modificar MaxLength = 5, y Text2 MaxLength = 50

En la parte de declaraciones del programa colocamos el siguiente código

Public Cxn As adodb.Connection


Public AdoS As adodb.Recordset
Public CxnFac As String

Explicación: Creamos las variables que ocuparemos para manipular la base de datos, con
el control ADO.
En el botón “Buscar”, colocamos el siguiente código:

Text2.Text = ""

If AdoS.RecordCount > 0 Then


AdoS.MoveFirst
enc = 0
While Not (AdoS.EOF) And enc = 0
If AdoS.Fields("numero") = Text1.Text Then
enc = 1
Else
AdoS.MoveNext
End If
Wend

If enc = 1 Then
Text2.Text = AdoS.Fields("nombre")
Command3.Enabled = True
Command4.Enabled = True
Else
MsgBox "El registro no se encontró", vbOKOnly, "Conexión web"
End If

Else
MsgBox "No existe ningún registro en la base de datos", vbOKOnly, "Conexión web"
End If

Explicación: Con la línea “If Ados.RecordCount >0 then”, indicamos que si la tabla tiene
registros, entonces entre a la condición.
AdoS.Movefirst, le indicamos que se mueva al primer registro.
En la línea “While Not (AdoS.EOF) And enc = 0”, indicamos que mientras no sea el último
registro de la tabla y la variable enc sea igual a cero, continúe el ciclo.
En la línea “If AdoS.Fields("numero") = Text1.Text Then”, indicamos que si el campo
numero es igual al texto que se encuentra en el Text1, entonces entre a la condición, donde
se marca la variable enc = 1, con lo que se saldría del ciclo, en caso contrario con la línea
“AdoS.MoveNext”, nos movemos al siguiente registro de la base de datos.
Creamos la función “mostrar_datos_en_tabla”

Public Function mostrar_datos_en_tabla()


tabla.AddItem ""
While tabla.Rows > 2
tabla.RemoveItem 2
Wend
c=2
If AdoS.RecordCount > 0 Then
AdoS.MoveFirst
While Not (AdoS.EOF)
tabla.AddItem ""
tabla.TextMatrix(c, 0) = AdoS.Fields("numero")
tabla.TextMatrix(c, 1) = AdoS.Fields("nombre")
AdoS.MoveNext
c=c+1
Wend
End If
End Function

Explicación: Con esta función lo que se hace es mostrar los datos en el control
MSFlexGrid, que son los campos numero y nombre.
En el botón “Agregar datos”, colocar el siguiente código:

If AdoS.RecordCount > 0 Then


AdoS.MoveFirst
enc = 0
While Not (AdoS.EOF) And enc = 0
If AdoS.Fields("numero") = Text1.Text Then
enc = 1
Else
AdoS.MoveNext
End If
Wend

If enc = 1 Then
MsgBox "Registro existente", vbOKOnly, "Conexión web"
Else
AdoS.AddNew
AdoS.Fields("numero") = Text1.Text
AdoS.Fields("nombre") = Text2.Text
AdoS.Update
MsgBox "Datos almacenados", vbOKOnly, "Conexión web"
Text1.Text = ""
Text2.Text = ""

Call mostrar_datos_en_tabla
End If

Else

AdoS.AddNew
AdoS.Fields("numero") = Text1.Text
AdoS.Fields("nombre") = Text2.Text
AdoS.Update
MsgBox "Datos almacenados", vbOKOnly, "Conexión web"
Text1.Text = ""
Text2.Text = ""

Call mostrar_datos_en_tabla
End If

Explicación: La línea “AdoS.AddNew”, reserva espacio para un nuevo registro en la tabla,


registro en el cual los campos numero y nombre le son asignados valores con Text1 y
Text2. Antes de esto se hace una búsqueda para ver si el registro que se intenta agregar ya
existe.
En el botón “Eliminar registro”, colocar el siguiente código:

If AdoS.RecordCount > 0 Then


AdoS.Delete adAffectCurrent
MsgBox "Registro eliminado satisfactoriamente", vbOKOnly, "Conexión web"
Else
MsgBox "No hay registros a eliminar", vbOKOnly, "Conexión web"
End If

Text1.Text = ""
Text2.Text = ""
Command3.Enabled = False
Command4.Enabled = False

Call mostrar_datos_en_tabla

Explicación: La línea “AdoS.Delete adAffectCurrent” lo que hace es eliminar el registro


actual, el registro que estamos viendo actualmente, o sea el registro encontrado, después de
pulsar el botón “Buscar”.

En el botón “Modificar datos”, colocar el siguiente código:

AdoS.Fields("numero") = Text1.Text
AdoS.Fields("nombre") = Text2.Text
AdoS.Update

MsgBox "Datos modificados", vbOKOnly, "Conexión web"


Text1.Text = ""
Text2.Text = ""
Command4.Enabled = False
Command3.Enabled = False

Call mostrar_datos_en_tabla

Explicación: En este código podemos ver que no se utiliza la línea AddNew, ya que no
queremos agregar un nuevo registro, sino modificar el registro actual. Así que solamente
asignamos a los campos los nuevos valores de los Text1 y Text2.
En el botón “Cancelar”, colocar el siguiente código:

Text1.Text = ""
Text2.Text = ""
Command3.Enabled = False
Command4.Enabled = False

En la parte “LOAD” del formulario, colocar el siguiente código:

tabla.ColWidth(1) = 4500
tabla.TextMatrix(0, 0) = "Número"
tabla.TextMatrix(0, 1) = "Nombre"

Set Cxn = New Connection


Cxn.CursorLocation = adUseClient
CxnFac = "Driver={MySQL ODBC 3.51
Driver};Server=www.freesql.org;Port=3306;Option=131072;Stmt=;Database=conexiondb;
Uid=conexiondb;Pwd=conectar;"
Cxn.Open CxnFac ' Abrimos la conexion
Set AdoS = New Recordset
AdoS.Open "Select * From alumnos", Cxn, adOpenStatic, adLockOptimistic

Call mostrar_datos_en_tabla

Explicación: En este código la línea que más nos debe llamar la atención es:
“Driver};Server=www.freesql.org;Port=3306;Option=131072;Stmt=;Database=conexiondb
;Uid=conexiondb;Pwd=conectar;"

Ya que esta línea es la que establece la conexión, en Server colocamos la página


www.freesql.org , en Port colocamos 3306, en Option colocamos 131072, en Database
colocamos el nombre de nuestra base de datos, la cual fue conexiondb, en Uid colocamos
nuestro nombre de usuario el cual fue conexiondb, y en Pwd colocamos nuestra contraseña,
la cual fue conectar.

Y la siguiente línea también nos interesa “AdoS.Open "Select * From alumnos", Cxn,
adOpenStatic, adLockOptimistic”

Dicha línea también nos interesa ya que en esta indicamos la tabla que queremos abrir, que
en este caso fue alumnos.
En el Timer1, colocar el siguiente código:

If AdoS.State = 1 Then
Label2.Caption = "Conectado a la base de datos"
Else
Label2.Caption = "Error en la conexión con la base de datos"
End If

Explicación: Si el estado de la base de datos es “1”, quiere decir que la conexión con la
base de datos se estableció correctamente.

Colocado todo el código fuente, nuestro programa se conectará a la base de datos que
creamos.
¿Como programar un juego en red?

Para programar un juego en red, se necesitan simples pasos, los cuales son los siguientes:

1. Crear una pantalla de Servidor y una pantalla de cliente. Esto para que el juego
pueda sostenerse solo, y no necesite que otro programa actúe como servidor.
2. Establecer la conexión entre el cliente y el servidor.
3. Para enviar un comando, se debe enviar una clave, que el programa que lo recibe lo
interpretará como que debe hacer una acción. Antes de realizar dicha acción debe
informar al origen, que ya recibió la orden y que procederá a ejecutarla, esto para si
el origen desea ejecutar alguna otra acción.
4. Gestionar los posibles eventos en los dos programas: Cliente y servidor. Ya que si el
cliente ganó, debe aparecer un mensaje de que ganó y en el programa servidor debe
aparecer que perdió.
Programando el juego del gato en red

Primeramente debemos crear los siguientes controles:


- 9 botones de comando que serán el tablero del juego, los cuales estarán dentro de un
frame, llamado frame2.
- Un frame y dentro de él dos botones de opción y textos para gestionar puertos y
conexiones a IP. Además de botones de comando para aceptar y para cancelar.

Debe ser tal como se muestra en la figura. Puede basarse en el código fuente proporcionado
para que sepa bien qué es lo que debe hacer.

En la parte “LOAD” del formulario, colocar el siguiente código:

Option1.Value = True

Explicación: Establecemos que la opción 1 aparecerá elegida por default.


En el botón Option1, colocar el siguiente código:

If Option1.Value = True Then


Label2.Visible = False
Text2.Visible = False
Text3.Visible = False
Label4.Visible = False
Command11.Visible = False
Label1.Visible = True
Text1.Visible = True
Command10.Visible = True
Text4.Text = "X"
End If

Explicación: Indicamos que se activen los controles correspondientes al servidor.

En el botón Option2, colocar el siguiente código:

If Option2.Value = True Then


Label2.Visible = True
Text2.Visible = True
Text3.Visible = True
Label4.Visible = True
Command11.Visible = True
Label1.Visible = False
Text1.Visible = False
Command10.Visible = False
Text4.Text = "O"
End If

Explicación: Indicamos que se activen los controles correspondientes al cliente.

En el botón “OK”, de servidor, colocar el siguiente código:

Winsock1.LocalPort = Text1.Text
Winsock1.Close
Winsock1.Listen
Frame1.Enabled = False
Frame2.Enabled = True

Command12.Visible = True

Explicación: Ponemos el juego a la espera de conexiones


En el botón “OK”, de cliente, colocar el siguiente código:

Winsock1.Connect Text2.Text, Text3.Text


Frame1.Enabled = False
Command12.Visible = True

Explicación: Con este código se establece la conexión Cliente a Servidor.

En el botón “X” colocar el siguiente código:

Winsock1.Close
Command12.Visible = False
Frame1.Enabled = True

Text1.Text = ""
Text2.Text = ""
Text3.Text = ""

Explicación: En este código la conexión entre cliente y servidor es cerrada.

En el control Winsock1, en el evento ConnectionRequest, colocar el siguiente código:

Winsock1.Close
Winsock1.Accept requestID

Explicación: El servidor acepta la conexión entrante.

En el control winsock, en el evento DataArrival, colocar el siguiente código:

Dim datos As String


Winsock1.GetData datos
If datos = "1" Then
Winsock1.SendData "recibido1"
Frame2.Enabled = True
If Text4.Text = "O" Then
Command1.Caption = "X"
Else
Command1.Caption = "O"
End If
End If

If datos = "recibido1" Then


Command1.Caption = Text4.Text
Frame2.Enabled = False
End If
If datos = "2" Then
Winsock1.SendData "recibido2"
Frame2.Enabled = True
If Text4.Text = "O" Then
Command2.Caption = "X"
Else
Command2.Caption = "O"
End If
End If

If datos = "recibido2" Then


Command2.Caption = Text4.Text
Frame2.Enabled = False
End If

If datos = "3" Then


Winsock1.SendData "recibido3"
Frame2.Enabled = True
If Text4.Text = "O" Then
Command3.Caption = "X"
Else
Command3.Caption = "O"
End If
End If

If datos = "recibido3" Then


Command3.Caption = Text4.Text
Frame2.Enabled = False
End If

If datos = "4" Then


Winsock1.SendData "recibido4"
Frame2.Enabled = True
If Text4.Text = "O" Then
Command4.Caption = "X"
Else
Command4.Caption = "O"
End If
End If

If datos = "recibido4" Then


Command4.Caption = Text4.Text
Frame2.Enabled = False
End If
If datos = "5" Then
Winsock1.SendData "recibido5"
Frame2.Enabled = True
If Text4.Text = "O" Then
Command5.Caption = "X"
Else
Command5.Caption = "O"
End If
End If

If datos = "recibido5" Then


Command5.Caption = Text4.Text
Frame2.Enabled = False
End If

If datos = "6" Then


Winsock1.SendData "recibido6"
Frame2.Enabled = True
If Text4.Text = "O" Then
Command6.Caption = "X"
Else
Command6.Caption = "O"
End If
End If

If datos = "recibido6" Then


Command6.Caption = Text4.Text
Frame2.Enabled = False
End If

If datos = "7" Then


Winsock1.SendData "recibido7"
Frame2.Enabled = True
If Text4.Text = "O" Then
Command7.Caption = "X"
Else
Command7.Caption = "O"
End If
End If

If datos = "recibido7" Then


Command7.Caption = Text4.Text
Frame2.Enabled = False
End If

If datos = "8" Then


Winsock1.SendData "recibido8"
Frame2.Enabled = True
If Text4.Text = "O" Then
Command8.Caption = "X"
Else
Command8.Caption = "O"
End If
End If

If datos = "recibido8" Then


Command8.Caption = Text4.Text
Frame2.Enabled = False
End If

If datos = "9" Then


Winsock1.SendData "recibido9"
Frame2.Enabled = True
If Text4.Text = "O" Then
Command9.Caption = "X"
Else
Command9.Caption = "O"
End If
End If

If datos = "recibido9" Then


Command9.Caption = Text4.Text
Frame2.Enabled = False
End If

Explicación: En data arrival, llegan todos los datos que se reciben y es aquí donde los
procesamos.
Y por último en el Timer1, colocar el siguiente código:

If Option1.Value = True And Winsock1.State = 2 Then


Label3.Caption = "Puerto " & Winsock1.LocalPort & " abierto"
End If

If Option1.Value = True And Winsock1.State = 7 Then


Label3.Caption = "Conexión recibida y aceptada. Conexión establecida"
End If

If Option2.Value = True And Winsock1.State = 7 Then


Label3.Caption = "Conexión establecida con la IP: " & Winsock1.RemoteHostIP
End If

If Not (Option1.Value = True And Winsock1.State = 2) And Not (Option2.Value = True


And Winsock1.State = 7) And Not (Option1.Value = True And Winsock1.State = 7) Then
Label3.Caption = ""
End If

If Len(Command1.Caption) > 0 And Len(Command2.Caption) > 0 And


Len(Command3.Caption) > 0 And Len(Command4.Caption) > 0 And
Len(Command5.Caption) > 0 And Len(Command6.Caption) > 0 And
Len(Command7.Caption) > 0 And Len(Command8.Caption) > 0 And
Len(Command9.Caption) > 0 Then
limpiar
MsgBox "Juego sin ganador", vbOKOnly, "Juego del gato en red"
End If

If Command1.Caption = "X" And Command2.Caption = "X" And Command3.Caption =


"X" Then
If Text4.Text = "X" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command1.Caption = "X" And Command4.Caption = "X" And Command7.Caption =


"X" Then
If Text4.Text = "X" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If
If Command1.Caption = "X" And Command5.Caption = "X" And Command9.Caption =
"X" Then
If Text4.Text = "X" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command2.Caption = "X" And Command5.Caption = "X" And Command8.Caption =


"X" Then
If Text4.Text = "X" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command3.Caption = "X" And Command5.Caption = "X" And Command7.Caption =


"X" Then
If Text4.Text = "X" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command3.Caption = "X" And Command6.Caption = "X" And Command9.Caption =


"X" Then
If Text4.Text = "X" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command4.Caption = "X" And Command5.Caption = "X" And Command6.Caption =


"X" Then
If Text4.Text = "X" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command7.Caption = "X" And Command8.Caption = "X" And Command9.Caption =


"X" Then
If Text4.Text = "X" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command1.Caption = "O" And Command2.Caption = "O" And Command3.Caption =


"O" Then
If Text4.Text = "O" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command1.Caption = "O" And Command4.Caption = "O" And Command7.Caption =


"O" Then
If Text4.Text = "O" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command1.Caption = "O" And Command5.Caption = "O" And Command9.Caption =


"O" Then
If Text4.Text = "O" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command2.Caption = "O" And Command5.Caption = "O" And Command8.Caption =


"O" Then
If Text4.Text = "O" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command3.Caption = "O" And Command5.Caption = "O" And Command7.Caption =


"O" Then
If Text4.Text = "O" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command3.Caption = "O" And Command6.Caption = "O" And Command9.Caption =


"O" Then
If Text4.Text = "O" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

If Command4.Caption = "O" And Command5.Caption = "O" And Command6.Caption =


"O" Then
If Text4.Text = "O" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If
If Command7.Caption = "O" And Command8.Caption = "O" And Command9.Caption =
"O" Then
If Text4.Text = "O" Then
MsgBox "Has ganado el juego", vbOKOnly, "Juego del gato en red"
Else
MsgBox "Has perdido el juego", vbOKOnly, "Juego del gato en red"
End If
limpiar
End If

Explicación: El timer es el que se encarga de verificar a cada instante si ya hay un ganador


o si el juego terminó sin ganador, y de acuerdo a esto manda un mensaje de información.
Como puedo programar una aplicación que se conecte a la red del MSN Messenger?

Para conectarse a la red del MSN Messenger desde visual basic, primeramente debe colocar
las siguientes referencias, desde el menú Proyecto -> Referencias

Y hecho esto podremos comenzar a programar nuestra aplicación


Programando aplicación para conectarse a la red del MSN Messenger

Este código no lo incluí en esta parte ya que es más que entendible, puedes chocarlo en los
códigos que te proporciono.
Despedida

Gracias por adquirir este curso


“CURSO PARA CREAR APLICACIONES EN RED CON VISUAL BASIC 6.0”

MARTÍN CAMPOS QUINTERO


martincamposquintero@gmail.com
www.sisadmic.tk

POSIBLES ACTUALIZACIONES DEL CURSO:

- Aplicación para controlar remotamente una computadora


- Aplicación para descargar archivos remotamente (FTP)
- Aplicación de control de acceso
- Aplicación para controlar funciones de impresora
- Aplicación para conectar con Latinchat
- Configurar opciones de la PC remota
- Aplicación de renta de videos en red
- Programa cliente – servidor, que siga la IP aunque sea dinámica

You might also like