David - Musings of an SRE

Sending your Structs across the wire (tcp connection)

Sending your structs across the wire and receiving them on the other side. Using encoding/gob can help ensure your data structures can receive it on the other side.

// server.go

package main

import ...

// Create your custom data struct
type Message struct {
  ID   string
  Data string
}

func main() {
  // for purpose of verbosity, I will be removing error handling from this
  // sample code

  server, err  := net.Listen("tcp", ":12345")
  conn, err = server.Accept()

  // create a temp buffer
  tmp := make([]byte, 500)

  // loop through the connection to read incoming connections. If you're doing by
  // directional, you might want to make this into a seperate go routine
  for {

    _, err = conn.Read(tmp)
    
    // convert bytes into Buffer (which implements io.Reader/io.Writer)
    tmpbuff := bytes.NewBuffer(tmp)

    tmpstruct := new(Message)

    // creates a decoder object
    gobobj := gob.NewDecoder(tmpbuffer)

    // decodes buffer and unmarshals it into a Message struct
    gobobj.decode(tmpstruct)

    // lets print out!
    fmt.Println(tmpstruct) // reflects.TypeOf(tmpstruct) == Message{}

  }

}
// client.go

import ...

type Message struct {
  ID   string
  Data string
}

func main(){
  // lets create the message we want to send accross
  msg := Message{ID: "Yo", Data: "Hello"}
  bin_buf := new(bytes.Buffer)

  // error handling still truncated
  conn, err

  // create a encoder object
  gobobj := gob.NewEncoder(bin_buf)

  // encode buffer and marshal it into a gob object
  gobobj.Encode(msg)

  conn.Write(bin_buf.Bytes())
}

References