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) } }