go__whispering-gophers/part3/part3.go

73 lines
1.6 KiB
Go

// Solution to part 3 of the Whispering Gophers code lab.
//
// This program listens on the host and port specified by the -listen flag.
// For each incoming connection, it launches a goroutine that reads and decodes
// JSON-encoded messages from the connection and prints them to standard
// output.
//
// You can test this program by running it in one terminal:
// $ part3 -listen=localhost:8000
// And running part2 in another terminal:
// $ part2 -dial=localhost:8000
// Lines typed in the second terminal should appear as JSON objects in the
// first terminal.
//
package main
import (
"encoding/json"
"flag"
"fmt"
"io"
"log"
"net"
)
var listenAddr = flag.String("listen", "localhost:8000", "host:port to listen on")
type Message struct {
Body string
}
func main() {
flag.Parse()
// TODO: Create a net.Listener listening from the address in the "listen" flag.
l, err := net.Listen("tcp", *listenAddr)
if err != nil {
log.Fatal(err)
}
for {
// TODO: Accept a new connection from the listener.
c, err := l.Accept()
if err != nil {
log.Fatal(err)
}
go serve(c)
}
}
func serve(c net.Conn) {
// TODO: Use defer to Close the connection when this function returns.
defer c.Close()
// TODO: Create a new json.Decoder reading from the connection.
e := json.NewDecoder(c)
for {
// TODO: Create an empty message.
m := Message{}
// TODO: Decode a new message into the variable you just created.
err := e.Decode(&m)
switch err {
case nil:
// TODO: Print the message to the standard output.
fmt.Printf("%+v\n", m)
case io.EOF:
log.Println("End of input")
return
default:
log.Fatal(err)
}
}
}