Let go through and try to understand how easy it can be to send and receive messages on tcp socket.
Lets first talk about the server and how to build one.
package main
import (
"fmt"
"net"
)
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
panic(err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
fmt.Println("request received")
if err != nil {
panic(err)
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
for {
messages := make([]byte, 128)
n, read_err := conn.Read(messages)
if read_err != nil {
fmt.Println("failed:", read_err)
return
}
fmt.Println("Got: ", string(messages[:n]))
_, write_err := conn.Write(messages[:n])
if write_err != nil {
fmt.Println("failed:", write_err)
return
}
}
}
net.Listen
returns a listener which can accept multiple connections
for each connection we can handleConnection in a separate goroutine. If you notice our handleConnection runs in a infinite loop and never exits. This is done to enable listening on the connection indefinitely.
conn.Read
is a blocking call and will wait until something is written on the connection.
conn.Write
will write back to the connection
Now comes the part of client
func main() {
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
log.Fatalf("Failed to dial: %v", err)
}
defer conn.Close()
scanner := bufio.NewScanner(os.Stdin)
messages := make([]byte, 128)
for {
fmt.Println("enter the message to send")
scanner.Scan()
message := []byte(scanner.Text())
_, write_err := conn.Write([]byte(message))
if write_err != nil {
fmt.Println("failed:", write_err)
return
}
n, read_err := conn.Read(messages)
if read_err != nil {
fmt.Println("failed:", read_err)
return
}
fmt.Printf("read %d bytes, echo: %s\n", n, messages[:n])
}
}
net.Dial
dials in and tries to create a connection
scanner.Scan
scans for the input
conn.Write
writes to the connection
conn.Read
is a blocking call and will wait until something is present to receive
again our whole logic is wrapped around a infinite loop so we are able to send and receive message until the application crashes.
You can find the complete code here