Solution 3: Working with TCP/IP and WebSocket
Understand how to build and manage TCP/IP and WebSocket servers in Go. Explore handling multiple client connections, reading and sending messages, and implementing signal handling to gracefully shut down servers on interrupts.
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 ...