Golang server, how to receive TCP JSON packet?
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()
}
Related videos on Youtube
Joseph Smitty
Updated on June 06, 2022Comments
-
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 wherejson.Unmarshal
is being used to decode TCP data. I can only find examples wherejson.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 about 9 years
Decoder
can read multiple messages, in the same way thatEncoder
writes multiple messages. They use a simple newline delimiter between objects. -
Joseph Smitty about 9 yearsThis 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 about 9 years@jimb thanks, I wasn't aware of that. I'll change my answer when I'm not on my phone :)