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
Contenido del curso
Concurrencia
- 2

Condiciones de Carrera en Programación Concurrente con Go
04:52 min - 3

Evitar Condiciones de Carrera en Go con Mutex y WaitGroup
11:26 min - 4

Lectura y Escritura Concurrente en Go con RWMutex
06:15 min - 5

Creación de un Sistema de Caché Concurrente en Go
14:29 min - 6

Manejo de Condiciones de Carrera en Go: Implementación de Mutex
08:52 min - 7

Cache concurrente en Go para cálculos intensivos de Fibonacci
16:31 min
Patrones de diseño
- 8

Patrones de Diseño en Programación Orientada a Objetos con Go
04:53 min - 9

Patrón de Diseño Factory en Go: Creación y Uso Práctico
15:17 min - 10

Implementación de Singleton en Go para Conexiones de Base de Datos
08:48 min - 11

Patrón de Diseño Adapter en Go: Implementación Práctica
09:51 min - 12

Patrón de Diseño Observer en Go: Implementación Práctica
11:59 min - 13

Implementación del Patrón de Diseño Strategy en Go
08:53 min
Net
- 14

Escaneo de Puertos TCP con Go: Introducción Básica
07:45 min - 15

Concurrencia en Go: Escáner de Puertos Eficiente y Personalizable
09:16 min - 16

Implementación de NetCAD como Cliente TCP en Go
10:14 min - 17

Construcción de Back End para Servidor de Chat en Go
Viendo ahora - 18

Implementación de un Servidor de Chat en Go con TCP
13:54 min
Conclusión
¿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
netpara manejar las conexiones yfmtpara 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!