package main import ( "encoding/json" "fmt" "net" ) const ( MESSAGE = "message" AUTHENTICATE = "authenticate" EXIT = "exit" REGISTER = "register" ) const ( SUCCESS = "success" FAILURE = "failure" PING = "ping" ) type Request struct { Type string Data string User string } func (req *Request) serialize() string { data, _ := json.Marshal(req) return string(data) } func (req *Request) toString() string { return fmt.Sprintf("%s: %s", req.User, req.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 parseRequest(data []byte) (Request, error) { var m Request err := json.Unmarshal(data, &m) return m, err } func parseResponse(data []byte) (Response, error) { var r Response err := json.Unmarshal(data, &r) return r, err }