summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/go.mod3
-rw-r--r--client/main.go115
-rw-r--r--client/utils.go13
3 files changed, 113 insertions, 18 deletions
diff --git a/client/go.mod b/client/go.mod
new file mode 100644
index 0000000..ffafd1f
--- /dev/null
+++ b/client/go.mod
@@ -0,0 +1,3 @@
+module vasthecat.ru/coursework-client
+
+go 1.16
diff --git a/client/main.go b/client/main.go
index 18796ae..f90a018 100644
--- a/client/main.go
+++ b/client/main.go
@@ -1,13 +1,61 @@
package main
import (
+ "bufio"
"encoding/json"
"fmt"
"log"
"net"
+ "os"
"sync"
)
+var storage struct {
+ sync.Mutex
+ messages []Message
+}
+
+func parseBuffer(previous []byte, new []byte) ([]Response, []byte) {
+ buf := append(previous, new...)
+ bufSize := uint32(len(buf))
+ var responses []Response
+ var idx uint32 = 0
+ for {
+ if idx+4 >= bufSize {
+ break
+ }
+ size := fromBytes(buf[idx : idx+4])
+ if size == 0 {
+ return responses, make([]byte, 0)
+ }
+ if idx+4+size >= bufSize {
+ break
+ } else {
+ resp, err := parseResponse(buf[idx+4 : idx+4+size])
+ if err == nil {
+ responses = append(responses, resp)
+ }
+ idx += 4 + size
+ }
+ }
+ return responses, buf[idx:]
+}
+
+func readResponse(conn net.Conn) (Response, error) {
+ var response Response
+ var err error
+
+ buf := make([]byte, 4096)
+ _, err = conn.Read(buf)
+ if err != nil {
+ return response, err
+ }
+
+ size := fromBytes(buf[:4])
+ rawResponse := buf[4 : size+4]
+ return parseResponse(rawResponse)
+}
+
func main() {
var wg sync.WaitGroup
conn, err := net.Dial("tcp", "localhost:8080")
@@ -15,20 +63,21 @@ func main() {
defer conn.Close()
wg.Add(1)
go func(conn net.Conn) {
- buf := make([]byte, 4096)
-
authMsg, _ := json.Marshal(Message{
Type: AUTHENTICATE,
Data: "auth",
User: "andrew",
})
_ = sendMessage(conn, authMsg)
+ reader := bufio.NewReader(os.Stdin)
- for i := 0; i < 20; i += 1 {
- fmt.Printf("Sending %d request\n", i)
+ for i := 0; i < 1000; i += 1 {
+ //fmt.Printf("Sending %d request\n", i)
+ line, _, _ := reader.ReadLine()
request, _ := json.Marshal(Message{
Type: MESSAGE,
- Data: fmt.Sprintf("Hello, %d", i),
+ //Data: fmt.Sprintf("Hello, %d", i),
+ Data: string(line),
User: "andrew",
})
err = sendMessage(conn, request)
@@ -36,12 +85,8 @@ func main() {
break
}
- fmt.Println("Waiting for response")
- _, _ = conn.Read(buf)
-
- size := fromBytes(buf[:4])
- response := parseResponse(buf[4 : size+4])
- fmt.Printf("Response: %s\n", response.Data)
+ response, _ := readResponse(conn)
+ _ = fmt.Sprintf("%s", response)
}
exitMsg, _ := json.Marshal(Message{
@@ -50,9 +95,57 @@ func main() {
User: "andrew",
})
_ = sendMessage(conn, exitMsg)
+ fmt.Println("Closed connection")
wg.Done()
}(conn)
+ receiver, err := net.Dial("tcp", "localhost:8081")
+ handleError(err)
+ defer receiver.Close()
+ wg.Add(1)
+ go func(conn net.Conn) {
+ req := Message{
+ Type: AUTHENTICATE,
+ Data: AUTHENTICATE,
+ User: "andrew",
+ }
+ err = sendMessage(conn, []byte(req.serialize()))
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+
+ _, err := readResponse(conn)
+ if err != nil {
+ return
+ }
+
+ for {
+ response, err := readResponse(conn)
+ if err != nil {
+ break
+ }
+
+ message, err := parseMessage([]byte(response.Data))
+ if err == nil {
+ storage.Lock()
+ storage.messages = append(storage.messages, message)
+ fmt.Printf("Got message: \"%s\"\n", message.Data)
+ storage.Unlock()
+ } else {
+ fmt.Println(err)
+ }
+
+ req := Message{
+ Type: MESSAGE,
+ Data: SUCCESS,
+ User: "andrew",
+ }
+ _ = sendMessage(conn, []byte(req.serialize()))
+ }
+ wg.Done()
+ }(receiver)
+
wg.Wait()
}
diff --git a/client/utils.go b/client/utils.go
index c11bf17..4dc64b7 100644
--- a/client/utils.go
+++ b/client/utils.go
@@ -62,15 +62,14 @@ func sendMessage(conn net.Conn, message []byte) error {
return nil
}
-func parseMessage(data []byte) Message {
+func parseMessage(data []byte) (Message, error) {
var m Message
- // TODO(andrew): Добавить обработку ошибок
- json.Unmarshal(data, &m)
- return m
+ err := json.Unmarshal(data, &m)
+ return m, err
}
-func parseResponse(data []byte) Response {
+func parseResponse(data []byte) (Response, error) {
var r Response
- json.Unmarshal(data, &r)
- return r
+ err := json.Unmarshal(data, &r)
+ return r, err
}