To implement a TCP server that communicates with multiple clients concurrently in Go, you can follow these steps:
Import necessary packages: Start by importing the net
and bufio
packages in your Go program.
Create a server listener: Create a TCP listener using the net.Listen
function. Specify the address and port where the server will listen for incoming connections.
Start accepting client connections: Once the server listener is created, start accepting client connections using the Accept
method of the listener. This method returns a new net.Conn
object representing the connection with the client.
Handle client connections concurrently: For each client connection, launch a new goroutine to handle it concurrently. Inside the goroutine, you can use bufio.NewReader
to read data from the client and bufio.NewWriter
to write data back to the client.
Implement client request processing: Within the goroutine, you can implement the logic to process the client's requests. This can involve parsing the request, performing the required computation, and generating a response. You can use standard Go constructs like loops and conditionals to handle different requests.
Here's an example implementation of a TCP server that communicates with multiple clients concurrently:
package main
import (
"bufio"
"fmt"
"net"
)
func handleConnection(conn net.Conn) {
defer conn.Close()
reader := bufio.NewReader(conn)
writer := bufio.NewWriter(conn)
for {
// Read request from client
request, err := reader.ReadString('\n')
if err != nil {
fmt.Println("Error reading:", err)
return
}
// Process request
response := processRequest(request)
// Send response to client
_, err = writer.WriteString(response + "\n")
if err != nil {
fmt.Println("Error writing:", err)
return
}
writer.Flush()
}
}
func processRequest(request string) string {
// Example request processing logic
return "Processed: " + request
}
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error starting server:", err)
return
}
defer listener.Close()
fmt.Println("Server started. Listening on :8080")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
return
}
go handleConnection(conn)
}
}
In this example, the server listens on port 8080
for incoming TCP connections. Each connection is handled in a separate goroutine using the handleConnection
function. The processRequest
function is a placeholder for your custom request processing logic.