diff options
Diffstat (limited to 'client')
| -rw-r--r-- | client/main.go | 63 | ||||
| -rw-r--r-- | client/utils.go | 76 |
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 +} |