Socket programming with TCP

De Departamento de Informatica
Saltar a: navegación, buscar

Contenido

Motivación

Las redes de computadoras permiten a las máquinas intercambiar información mediante diversos protocolos que controlan estas comunicaciones. Bajo este contexto son de especial importancia los protocolos que se encargan de enviar los datos a través de la red (protocolos de transporte). Éste artículo muestra como un programa puede usar la interfaz de Sockets que proveen los sistemas operativos para usar los servicios de las redes de computadoras para comunicarse con otras máquinas.

Programando con Sockets TCP

Los Sockets son una interfaz que provee el sistema operativo para usar los servicios de la Capa de Transporte de la red. Dependiendo del tipo de protocolo que deseemos usar varía el tipo de socket. Los protocolos más famosos en este campo son TCP y UDP, sin embargo en este artículo vamos a referirnos solo al protocolo TCP.

Arquitectura Cliente-Servidor

Las conexiones entre las computadoras usualmente siguen el modelo llamado Cliente-Servidor, el cual contiene como dos actores principales a los llamados creativamente Cliente y Servidor.

  • Cliente es un proceso en alguna máquina que realiza peticiones

a otra máquina externa en la red, de la cual necesita cierta información para operar.

  • Servidor es un proceso en una máquina de la red

que está constantemente esperando peticiones de clientes.

Es importante mencionar que el objetivo de esta separación va más allá de mejorar el rendimiento de un sistema. Esta separación de tipo Lógica ayuda a clarificar los diseños y planificaciones de los sistemas computacionales centralizando la gestión de la información en los servidores y repartiendo las responsabilidades en el mismo sistema.

Interacción Cliente-Servidor

La interacción entre un cliente y un servidor funciona bajo el siguiente esquema:

  1. Ambos procesos preparan sus interfaces TCP para realizar la comunicación.
  2. El cliente es el que inicia la interacción,
    contactando al servidor,
    quien debe estar listo para responder (paso anterior).
    Este contacto debe hacerse realizando una llamada al Socket del servidor.
    Pensando en una visita a un amigo,
    este paso corresponde a tocar la puerta para que salga a abrirnos.
  3. Cuando el server "escucha la puerta" crea un Socket para recibir la conexión.
    Este proceso se lleva a cabo en un HandShaking de tres instancias
    con el cual TCP establece la conexión.
    Este proceso es completamente transparente al cliente y al servidor
    y ocurre sobre la capa de transporte.
  4. Luego de escuchar la consulta,
    el server acepta la conexión con el cliente y arma unSocket dedicado a dicha conexión.
    Al final del proceso existe una conexión TCP establecida entre los dos actores.

Cliente-servidor-tcp.jpeg


Desde el punto de vista de las aplicaciones un socket es una tubería o pipe entre el proceso cliente y el proceso server que lo atiende. A través del socket ambos procesos pueden enviar y recibir información mediante flujos de bytes. La importancia de los sockets en la comunicación de estructuras Cliente-Servidor hace que usualmente se llame Socket Programming.

Ejemplo: python

A continuación se muestra el código de un cliente y servidor sencillo que se envían mensajes usando un Socket TCP.

  • Cliente TCP
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 import socket
 
 # cargamos identificacion TPC
 # conexion de ejemplo
 # computador local: 192.168.1.100
 # puerto de ejemplo: 9418 (git)
 TCP_IP      = 192.168.1.100 
 TCP_PORT    = 9418
 BUFFER_SIZE = 1024
 
 # construimos mensaje de prueba
 MESSAGE = "Prueba usando conexion TCP en python\n"
 # inicializamos el socket
 toServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 # establecemos la conexion (notar que no nos preocupamos por el 3-way handshake)
 toServer.connect((TCP_IP, TCP_PORT))
 # enviamos el mensaje al servidor
 toServer.send(MESSAGE)
 # capturamos la respuesta
 response = toServer.recv(BUFFER_SIZE)
 # terminamos la conexion
 toServer.close()
 print "respuesta: ", response
  • Server TCP
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 import socket
 # Preparamos server
 # asignamos direccion y puerto a escuchar
 TCP_IP = 192.168.1.100
 TCP_PORT = 9418
 BUFFER_SIZE = 1024 # el taman~o del buffer influye en el tiempo de respuesta
 # preparamos datos del socket
 listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 listener.bind((TCP_IP, TCP_PORT))
 # dejamos al server escuchando conexiones
 listener.listen(1)
 # aceptando conexiones
 connection, address = listener.accept()
 print "conexion establecida con: ", address
 while 1:
     datos = connection.recv(BUFFER_SIZE)
     if not datos:
       break
     # mostramos datos recibidos
     print "datos recibidos: ", datos
     # enviando respuesta
     connection.send("datos recibidos con exito\n")
 connection.close()

Referencias

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas