Golang server, how to receive TCP JSON packet?

10,557

You can patch a json.Decoder directly to the connection:

func handleServerConnection(c net.Conn) {

    // we create a decoder that reads directly from the socket
    d := json.NewDecoder(c)

    var msg coordinate

    err := d.Decode(&msg)
    fmt.Println(msg, err)

    c.Close()

}
Share:
10,557

Related videos on Youtube

Joseph Smitty
Author by

Joseph Smitty

Updated on June 06, 2022

Comments

  • Joseph Smitty
    Joseph Smitty almost 2 years

    I'm new to Golang and am using the "Server" code here as a starting point: http://www.golang-book.com/13/index.htm#section7

    I've attempted to use JSON instead of Gob decoding (since I am required to write the client in C#), and I'm sending the JSON TCP data client data in a separate script from the code below.

    I'm stuck on the part where I'm actually receiving the JSON TCP data and storing it in a variable for it to be decoded. It looks like I can decode it with json.Unmarshal, but I can't find any examples where json.Unmarshal is being used to decode TCP data. I can only find examples where json.Unmarshal is being used to decode JSON strings.

    My code is below:

    package main
    
    import (
      "encoding/json"
      "fmt"
      "net"
    )
    
    type coordinate struct {
      X float64 `json:"x"`
      Y float64 `json:"y"`
      Z float64 `json:"z"`
    }
    
    func server() {
      // listen on a port
      ln, err := net.Listen("tcp", ":9999")
      if err != nil {
        fmt.Println(err)
        return
      }
      for {
        // accept a connection
        c, err := ln.Accept()
        if err != nil {
          fmt.Println(err)
          continue
        }
        // handle the connection
        go handleServerConnection(c)
      }
    }
    
    func handleServerConnection(c net.Conn) {
      // receive the message
      var msg coordinate
    

    Stuck on the line below. What could I set the rawJSON variable equal to?

      err := json.Unmarshal([]byte(rawJSON), &msg)
      if err != nil {
        fmt.Println(err)
      } else {
        fmt.Println("Received", msg)
      }
    
      c.Close()
    }
    
    func main() {
      go server()
    
      //let the server goroutine run forever
      var input string
      fmt.Scanln(&input)
    }
    
  • JimB
    JimB about 9 years
    Decoder can read multiple messages, in the same way that Encoder writes multiple messages. They use a simple newline delimiter between objects.
  • Joseph Smitty
    Joseph Smitty about 9 years
    This code/explanation helps me a lot, thank you. My goal is to create a client that sends coordinates in an online game to a Golang server, so I do need to send constant streams of data. I'll look into the EOF some more, thanks.
  • Not_a_Golfer
    Not_a_Golfer about 9 years
    @jimb thanks, I wasn't aware of that. I'll change my answer when I'm not on my phone :)