summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/main.go63
-rw-r--r--client/utils.go76
2 files changed, 139 insertions, 0 deletions
diff --git a/client/main.go b/client/main.go
new file mode 100644
index 0000000..18796ae
--- /dev/null
+++ b/client/main.go
@@ -0,0 +1,63 @@
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "log"
+ "net"
+ "sync"
+)
+
+func main() {
+ var wg sync.WaitGroup
+ conn, err := net.Dial("tcp", "localhost:8080")
+ handleError(err)
+ 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)
+
+ for i := 0; i < 20; i += 1 {
+ fmt.Printf("Sending %d request\n", i)
+ request, _ := json.Marshal(Message{
+ Type: MESSAGE,
+ Data: fmt.Sprintf("Hello, %d", i),
+ User: "andrew",
+ })
+ err = sendMessage(conn, request)
+ if err != nil {
+ 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)
+ }
+
+ exitMsg, _ := json.Marshal(Message{
+ Type: MESSAGE,
+ Data: "exit",
+ User: "andrew",
+ })
+ _ = sendMessage(conn, exitMsg)
+ wg.Done()
+ }(conn)
+
+ wg.Wait()
+}
+
+func handleError(err error) {
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/client/utils.go b/client/utils.go
new file mode 100644
index 0000000..c11bf17
--- /dev/null
+++ b/client/utils.go
@@ -0,0 +1,76 @@
+package main
+
+import (
+ "encoding/json"
+ "net"
+)
+
+const (
+ MESSAGE = "message"
+ AUTHENTICATE = "authenticate"
+ RENAME = "rename"
+)
+
+const (
+ SUCCESS = "success"
+ FAILURE = "failure"
+)
+
+type Message struct {
+ Type string
+ Data string
+ User string
+}
+
+func (msg *Message) serialize() string {
+ data, _ := json.Marshal(msg)
+ return string(data)
+}
+
+type Response struct {
+ Status string
+ Data string
+}
+
+func toBytes(num uint32) []byte {
+ buf := make([]byte, 4)
+ var mask uint32 = 0x00FF
+ for i := 0; i < 4; i += 1 {
+ buf[4-i-1] = byte(num & mask)
+ num >>= 8
+ }
+ return buf
+}
+
+func fromBytes(data []byte) uint32 {
+ var num uint32
+ for i := 0; i < 4; i += 1 {
+ num += uint32(data[i] << ((4 - i - 1) * 8))
+ }
+ return num
+}
+
+func sendMessage(conn net.Conn, message []byte) error {
+ size := uint32(len(message))
+
+ data := append(toBytes(size), message...)
+ _, err := conn.Write(data)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func parseMessage(data []byte) Message {
+ var m Message
+ // TODO(andrew): Добавить обработку ошибок
+ json.Unmarshal(data, &m)
+ return m
+}
+
+func parseResponse(data []byte) Response {
+ var r Response
+ json.Unmarshal(data, &r)
+ return r
+}