package main import ( "encoding/json" "fmt" "log" "net" ) const ( MESSAGE = "message" AUTHENTICATE = "authenticate" RENAME = "rename" ) const ( SUCCESS = "success" FAILURE = "failure" ) type Message struct { Type string Data string User string } type Response struct { Status string Data string } func parseMessage(data []byte) Message { var m Message // TODO(andrew): Добавить обработку ошибок json.Unmarshal(data, &m) return m } func handleConnection(conn net.Conn) { defer conn.Close() maxAuthAttempts := 5 authAttempts := 0 authenticated := false buf := make([]byte, 4096) for { if authAttempts >= maxAuthAttempts { resp, _ := json.Marshal(Response{ Status: FAILURE, Data: "Превышено количество неавторизованных запросов", }) _, _ = conn.Write(resp) break } readLen, err := conn.Read(buf) if err != nil { break } message := parseMessage(buf[:readLen]) if message.Type == AUTHENTICATE { // TODO(andrew): Добавить процесс аутентификации if true { authenticated = true } } if !authenticated { resp, _ := json.Marshal(Response{ Status: FAILURE, Data: "Для работы с сервером необходима аутентификация", }) _, err = conn.Write(resp) if err != nil { conn.Close() break } else { authAttempts += 1 continue } } if message.Data == "exit" { break } fmt.Println(message.Data) resp, _ := json.Marshal(Response{ Status: SUCCESS, Data: "some data", }) _, err = conn.Write(resp) if err != nil { err = conn.Close() break } } } func main() { sock, err := net.Listen("tcp", "localhost:8080") handleError(err) for { conn, err := sock.Accept() if err == nil { go handleConnection(conn) } else { break } } } func handleError(err error) { if err != nil { log.Fatal(err) } }