summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2021-04-26 20:26:15 +0400
committerAndrew <saintruler@gmail.com>2021-04-26 20:26:15 +0400
commit6276962c32b4be940cb6959cc746abbd81c73a45 (patch)
treef901837e6a4429d15c7bd40f1a2dc9e95bd84f19
Initial commit for server.
-rw-r--r--.gitignore1
-rw-r--r--server/main.go120
-rw-r--r--tester.py23
3 files changed, 144 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..723ef36
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.idea \ No newline at end of file
diff --git a/server/main.go b/server/main.go
new file mode 100644
index 0000000..ec848ad
--- /dev/null
+++ b/server/main.go
@@ -0,0 +1,120 @@
+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)
+ }
+}
diff --git a/tester.py b/tester.py
new file mode 100644
index 0000000..d5e9f32
--- /dev/null
+++ b/tester.py
@@ -0,0 +1,23 @@
+from socket import socket, SOCK_STREAM
+import json
+
+MESSAGE, AUTHENTICATE, RENAME = "message", "authenticate", "rename"
+
+with socket() as sock:
+ addr = host, port = "localhost", 8080
+ print(addr)
+ sock.connect(addr)
+
+ for i in range(1000):
+ print(f"Sending {i} request")
+ request = {
+ "type": "message",
+ "data": f"hello, {i}",
+ "user": "andrew"
+ }
+ sock.sendall(json.dumps(request).encode())
+ print("Waiting for response")
+ response = sock.recv(4096).decode()
+ print(f"Response: {response}")
+
+ sock.sendall("exit".encode())