Solution 3: Working with TCP/IP and WebSocket
Let’s solve the challenge set in the previous lesson.
We'll cover the following...
We'll cover the following...
Solution
To run the client side for the concTCP.go
TCP server, open a new terminal window and copy and paste the below command in it:
nc localhost 1234
Here’s an updated version of concTCP.go
with signal handling. Execute the playground below and press “Ctrl + C” on the server side to stop the server.
package main import ( "bufio" "fmt" "net" "os" "os/signal" "strconv" "strings" "syscall" ) var count = 0 func handleConnection(c net.Conn) { fmt.Print(".") for { netData, err := bufio.NewReader(c).ReadString('\n') if err != nil { fmt.Println(err) return } temp := strings.TrimSpace(string(netData)) if temp == "STOP" { break } fmt.Println(temp) counter := "Client number: " + strconv.Itoa(count) + "\n" c.Write([]byte(string(counter))) } c.Close() } func main() { arguments := os.Args if len(arguments) == 1 { fmt.Println("Please provide a port number!") return } PORT := ":" + arguments[1] l, err := net.Listen("tcp4", PORT) if err != nil { fmt.Println(err) return } defer l.Close() // Handle SIGINT signal to gracefully shut down the server sigint := make(chan os.Signal, 1) signal.Notify(sigint, syscall.SIGINT) go func() { <-sigint fmt.Println("\n Received SIGINT signal, shutting down...") l.Close() os.Exit(0) }() for { c, err := l.Accept() if err != nil { fmt.Println(err) return } go handleConnection(c) count++ } }
concTCP.go
Code explanation
Line 14: This line declares a global variable count with an initial value of
0
.Line 16: This ...