aboutsummaryrefslogtreecommitdiffhomepage
path: root/server.go
blob: 56cd582a4fc26d17f8627a7e707ad0f07cafa3b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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)
	}
}