Tutorial: Un mundo de sockets.
Buenas. En primer lugar, este tutorial va dirigido tanto a los programadores como a los
curiosos, que desean saber cómo funciona la comunicación entre ordenadores. Si alguna
vez te has preguntado cómo funciona un servidor web, un FTP, el correo o el irc, y,
especialmente has querido diseñar un aplicación similar, ésta debería ser una buena
introducción.
Hoy en día, una de las principales aplicaciones de la informática es la comunicación
entre máquinas, a través de redes. Ésto nos permite hacer conexiones de una máquina
a otra y enviar datos con un objetivo. Cuando uno ve un video por streaming, o habla
con un amigo a través de mensajería instantanea, puede hacerlo porque hay una máquina
que le ofrece unos datos (un servidor) y otra que hace la petición y los interpreta
(un cliente).
Hagamos un gráfico ascii:
Servidor [IP] [puerto] <------- Protocolo --------> [puerto [IP] Cliente
Es muy sencillo:
IP: Nombre de la máquina en una red, una identificación única. (ej: 10.0.0.1)
Puerto: Es el medio de acceso a la máquina. (ej: 80)
Protocolo: El método formal acordado de comunicación. (ej: TCP)Tanto los puertos como los protocolos están definidos por una serie de entidades
que crean normas para que sean standard. Por ejemplo, un servidor Web suele usar
TCP como protocolo y puerto 80, uno de IRC los puertos desde el 6667 al 6669... etcSupongamos que uno abre su navegador y escribe la dirección de Google. Desde que se pulsa
"Ir a" hasta que vemos la web y podemos utilizarla, ocurren una serie de cosas:Cliente: Hola, soy Mozilla Firefox, desde X IP y me gustaría ver la web.
Servidor: Hola, soy Apache, desde X IP, perteneciente al dominio de Google
ahora te envío lo que necesitas.Cliente: Mmm, me están enviando datos, una cabecera... HTML... voy a interpretarlos.
Usuario: Joé, mil resultados para "porn".
Bien, ahora que sabemos ésto, diseñaremos una aplicación que utilice los
conceptos, para comunicarse entre dos máquinas. En este caso, crearemos
una simple aplicación de Chat en Visual Basic 6.0, ya que vi una petición
en un thread anterior al respecto.Empecemos por hacer una interfaz para el servidor. Algo así podría servir:
http://img133.imageshack.us/img133/6660/tutorial13sk.jpg
Como se puede observar, no hay más que dos textBox (cajas de texto), un botón
para enviar y un control de Winsock, el que nos dará el uso de la IP, puerto y protocolo.La textbox pequeña es: text1
La textbox grande es: text2
Y el boton: command1
El socket: winsock1
Ahora, en el código fuente, estableceremos:
'-------------------------------------
' Para iniciar el socket
'-------------------------------------Private Sub form_load()
Winsock1.LocalPort = 1111 ' Este será nuestro puerto.
Winsock1.Listen ' Y aquí le decimos que escuche por conexiones entrantes.
End Sub'-------------------------------------
' Para aceptar conexiones entrantes
'-------------------------------------Private Sub WinSock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Accept requestID ' Aceptamos la conexión de un cliente
End Sub'--------------------------------------
' Para interpretar los datos recibidos
'--------------------------------------Private Sub WinSock1_DataArrival(ByVal bytesTotal As Long)
Dim datos As String ' Declaramos una variable
Winsock1.GetData datos ' Metemos en la variable los datos que recibimos
Text2.Text = Text2.Text & datos ' Añadimos al textbox grande el texto
Text2.SelStart = Len(Text2.Text) ' Ponemos el cursor al final del textbox grande
End Sub'-----------------------------------------
' Para cuando pulsemos el botón de enviar
'-----------------------------------------Private Sub Command1_Click()
Dim datos As String ' Declaramos una variable
datos = text1.Text ' Metemos en la variable los datos a enviar
text2.Text = text2.Text & datos & vbCrLf ' Añadimos al textbox grande el texto
WinSock1.SendData datos ' Enviamos los datos
Text2.SelStart = Len(Text2.Text) ' Ponemos el cursor al final de textbox grande
Text1.Text = "" ' Borramos el texto del textbox 1
Text1.SetFocus ' Y le damos foco
End SubY ese sería todo el código necesario para el servidor.
Diseñemos ahora el cliente:http://img479.imageshack.us/img479/6946/tutorial26cz.jpg
Os recomiendo que dupliqueis el proyecto del servidor, puesto que el cliente es casi
igual y solamente hay que hacer unas pequeñas modificaciones. Concretamente,
quitaremos la parte de aceptar conexiones entrantes y haremos que nuestro cliente
se conecte al servidor. Quedaría así:'-------------------------------------
' Para iniciar el socket
'-------------------------------------Private Sub form_load()
WinSock1.RemoteHost = Text3.text ' Le pasamos a WinSock la IP especificada en el textbox
WinSock1.RemotePort = 1111 ' Y también el puerto
WinSock1.Connect ' Le decimos que conecte
End Sub'--------------------------------------
' Para interpretar los datos recibidos
'--------------------------------------Private Sub WinSock1_DataArrival(ByVal bytesTotal As Long)
Dim datos As String ' Declaramos una variable
Winsock1.GetData datos ' Metemos en la variable los datos que recibimos
Text2.Text = Text2.Text & datos ' Añadimos al textbox grande el texto
Text2.SelStart = Len(Text2.Text) ' Ponemos el cursor al final del textbox grande
End Sub'-----------------------------------------
' Para cuando pulsemos el botón de enviar
'-----------------------------------------Private Sub Command1_Click()
Dim datos As String ' Declaramos una variable
datos = text1.Text ' Metemos en la variable los datos a enviar
text2.Text = text2.Text & datos & vbCrLf ' Añadimos al textbox grande el texto
WinSock1.SendData datos ' Enviamos los datos
Text2.SelStart = Len(Text2.Text) ' Ponemos el cursor al final de textbox grande
Text1.Text = "" ' Borramos el texto del textbox 1
Text1.SetFocus ' Y le damos foco
End SubY no hay más ! Es así de simple. Espero este tutorial haya servido de algo.
Un saludo y hasta otra. :-)