package main import ( "bufio" "fmt" "net" "strings" ) var ( clients = make(map[net.Conn]string) chats [20]string chats_i int ) func broadcast(message string) { for conn, _ := range clients { fmt.Fprint(conn, message) } } func handleCommand(conn net.Conn, message string) { parts := strings.Split(message, " ") command := parts[0] fmt.Println("command >>", command) switch command { case "login": name := parts[1] fmt.Printf("%v now is %v\n", clients[conn], name) clients[conn] = name fmt.Fprintf(conn, "!%v\n", name) default: fmt.Println("Command not found") } } func handleConnection(conn net.Conn) { defer conn.Close() clients[conn] = conn.RemoteAddr().String() fmt.Println("Client connected: ", clients[conn]) fmt.Fprintln(conn, "127.0.0.1:7654=Hello everyone from server") for i := 0; i < chats_i; i++ { fmt.Fprint(conn, chats[i]) } for { message, error := bufio.NewReader(conn).ReadString('\n') if error != nil { break } if message[0] == '/' { handleCommand(conn, message[1:len(message)-1]) } else { chats[chats_i] = clients[conn] + "=" + message fmt.Print(">> ", chats[chats_i]) broadcast(chats[chats_i]) chats_i = chats_i + 1 if chats_i >= len(chats) { chats_i = 0 } } } fmt.Println("Client disconnected:", clients[conn]) delete(clients, conn) } func main() { listener, err := net.Listen("tcp", "0.0.0.0:7654") if err != nil { fmt.Println("Error starting server:", err) return } defer listener.Close() fmt.Println("Chat server started on 0.0.0.0:7654") chats_i = 0 for { conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err) continue } go handleConnection(conn) } }