Another common, as well as important, scenario in any web application is to send the data back to the client or responding to the client. Go provides a convenient way to write a message on a connection as bytes, which we will be covering in this recipe.
Writing data to a TCP connection
Getting ready...
As we have already created a TCP server that reads incoming connection data in the previous recipe, we will just update it to write the message back to the client.
How to do it...
In this recipe, we are going to update the handleRequest method in the program to write data back to the client. Perform the following steps:
- Create tcp-server-write-data.go and copy the following content:
package main
import
(
"bufio"
"fmt"
"log"
"net"
)
const
(
CONN_HOST = "localhost"
CONN_PORT = "8080"
CONN_TYPE = "tcp"
)
func main()
{
listener, err := net.Listen(CONN_TYPE, CONN_HOST+":"+CONN_PORT)
if err != nil
{
log.Fatal("Error starting tcp server : ", err)
}
defer listener.Close()
log.Println("Listening on " + CONN_HOST + ":" + CONN_PORT)
for
{
conn, err := listener.Accept()
if err != nil
{
log.Fatal("Error accepting: ", err.Error())
}
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn)
{
message, err := bufio.NewReader(conn).ReadString('\n')
if err != nil
{
fmt.Println("Error reading: ", err.Error())
}
fmt.Print("Message Received:", string(message))
conn.Write([]byte(message + "\n"))
conn.Close()
}
- Run the program with the following command:
$ go run tcp-server-write-data.go
How it works...
Once we run the program, the TCP server will start locally listening on port 8080. Execute an echo command from the command line, as follows:
$ echo -n "Hello to TCP server\n" | nc localhost 8080
This will give us the following response from the server:
Hello to TCP server
Let’s look at the changes we introduced in this recipe to write data to the client. Everything in handleRequest is exactly the same as in the previous recipe except we introduced a new line that writes data as a byte array to the connection, as follows:
func handleRequest(conn net.Conn)
{
...
conn.Write([]byte(message + "\n"))
...
}