89 lines
2.3 KiB
Go
89 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
// vamos a crear el socket que se va a encargar de recibir las conexiones
|
|
fmt.Println("Abriendo puerto para permitir la conexion")
|
|
listener, err := net.Listen("tcp", "0.0.0.0:4444")
|
|
fmt.Println(listener.Addr())
|
|
if err != nil {
|
|
fmt.Println("Tienes un error a la hora de abrir el socket")
|
|
}
|
|
defer listener.Close()
|
|
fmt.Println("Iniciando loop")
|
|
for {
|
|
conn, err := listener.Accept() // usamos el metodo accept del objeto listener para aceptar una conexion
|
|
// esa conexion la tratamos como objeto
|
|
if err != nil {
|
|
fmt.Println("Error al recibir la conexion")
|
|
}
|
|
fmt.Println("Recibiendo conexion de:", conn.RemoteAddr())
|
|
user := login(conn)
|
|
mensaje := string(fmt.Sprintf("Hola %s\n", user))
|
|
_, err = conn.Write([]byte(mensaje)) // usamos el metodo write del objeto conn para enviar un mensaje al cliente
|
|
if err != nil {
|
|
fmt.Println("Error al enviar mensaje")
|
|
}
|
|
go handleConnection(conn, user) // creamos una go routine para manejar cada conexion de manera separada
|
|
|
|
}
|
|
}
|
|
|
|
func login(conn net.Conn) string {
|
|
_, err := conn.Write([]byte(fmt.Sprintf("Favor de escribir nombre de usuario: ")))
|
|
if err != nil {
|
|
fmt.Println("Error al enviar mensaje")
|
|
}
|
|
buf := make([]byte, 1024)
|
|
n, err := conn.Read(buf)
|
|
data := string(buf[:n])
|
|
user := strings.TrimSpace(data)
|
|
fmt.Printf("Se unio el usuario %s \n", user)
|
|
return user
|
|
}
|
|
|
|
func handleConnection(conn net.Conn, user string) {
|
|
fmt.Println("Cerrando la conexion")
|
|
defer conn.Close()
|
|
enviarMensajeCliente(conn, user)
|
|
enviarMensajeServer(conn, user)
|
|
}
|
|
|
|
func enviarMensajeServer(conn net.Conn, user string) {
|
|
for {
|
|
fmt.Printf("Mensaje: ")
|
|
var data string
|
|
fmt.Scan(&data)
|
|
mensaje := strings.TrimSpace(data)
|
|
_, err := conn.Write([]byte(fmt.Sprintf("Mensaje del Server: %s\n", mensaje)))
|
|
if err != nil {
|
|
fmt.Println("Error al enviar mensaje")
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func enviarMensajeCliente(conn net.Conn, user string) {
|
|
for {
|
|
_, err := conn.Write([]byte(fmt.Sprintf("Mensaje: ")))
|
|
if err != nil {
|
|
fmt.Println("Error al enviar mensaje")
|
|
}
|
|
buf := make([]byte, 1024)
|
|
n, err := conn.Read(buf)
|
|
if err != nil {
|
|
fmt.Println("Error al escribir mensaje")
|
|
return
|
|
}
|
|
data := string(buf[:n])
|
|
mensaje := strings.TrimSpace(data)
|
|
fmt.Printf("Mensaje de %s: %s\n", user, mensaje)
|
|
}
|
|
|
|
}
|