Construcción de Back End para Servidor de Chat en Go
Clase 17 de 19 • Curso de Go Avanzado: Concurrencia y Patrones de Diseño
Resumen
¿Cómo construir un servidor de chat en Go?
En esta clase, abordamos la creación de un servidor de chat utilizando Go. Si bien en la lección anterior creamos el cliente, ahora es momento de profundizar en el backend del proyecto para dar vida a nuestro sistema de mensajería. Vamos a explorar el código y entender cada pieza fundamental en este rompecabezas.
¿Qué es el tipo client
y cómo se utiliza?
Primero, definimos un nuevo tipo llamado client
, que es esencialmente un canal que transmite strings
. Este tipo es clave, ya que es el medio por el cual enviaremos mensajes dentro del chat. Aquí están los pasos necesarios:
- Definición inicial:
type client chan<- string
- Variables de canal:
incomeingClients
: canal para los clientes que se conectan.livingClients
: canal para los que abandonan el chat.messages
: canal para los mensajes en sí, de tipostring
.
¿Cómo se gestionan las conexiones del cliente?
La función handleConnection
se encarga de manejar las conexiones de los clientes de manera individual. Cada cliente que se conecta es asignado a una instancia de esta función, asegurando un manejo efectivo y seguro de los recursos.
Pasos dentro de handleConnection
:
-
Asignar un nombre único a cada cliente usando la dirección remota.
clientName := con.RemoteAddr().String()
-
Enviar un mensaje de bienvenida al cliente que se conecta y notificar al resto de los clientes.
messages <- fmt.Sprintf("Bienvenido al servidor, %s", clientName) messages <- fmt.Sprintf("Nuevo cliente ha llegado: %s", clientName)
-
Lectura de mensajes: Utilizando un escáner para leer continuamente mensajes desde la terminal:
inputMessage := bufio.NewScanner(con) for inputMessage.Scan() { messages <- fmt.Sprintf("%s: %s", clientName, inputMessage.Text()) }
¿Cómo funciona la escritura de mensajes?
La función messageWrite
es responsable de escribir los mensajes a través de la conexión de cada cliente. Utiliza una goroutine para manejar la concurrencia y mantener el flujo de mensajes constante.
func messageWrite(con net.Conn, message chan string) {
for msg := range message {
fmt.Fprintln(con, msg)
}
}
¿Cómo manejar la desconexión del cliente?
Cuando un cliente decide desconectar, es importante informar a los demás y liberar recursos:
- Se finaliza el ciclo de escaneo de mensajes.
- Se reporta que un cliente ha abandonado el chat.
messages <- fmt.Sprintf("%s ha dejado el chat.", clientName)
¿Cuáles son las herramientas clave utilizadas?
Para llevar a cabo este proyecto, hemos aprovechado las siguientes herramientas de Go:
- Channels: Para la comunicación entre goroutines.
- Goroutines: Para la ejecución concurrente de las funciones.
- Packages estándar de Go: Como
net
para manejar las conexiones yfmt
para el formateo de salida.
Con este conjunto de herramientas y técnicas, has aprendido a establecer la base de un servidor de chat en Go. Aunque este es solo el comienzo, invita a la exploración y manipulación de conexiones concurrentes y mensajes en un entorno de producción real. Si estás interesado en completar y ejecutar este proyecto, te animo a continuar aprendiendo y descubrir cómo optimizar y expandir este sistema de chat. ¡Buena suerte y sigue adelante!