51/100 Dias de Golang - Criando um servidor TCP em Go
Table of Contents
#
Criando um servidor TCP em Go
Estava pensando em quais assuntos fazer para o blog, quero explorar mais sobre testes, fazer uma aplicação com banco de dados, ver como funciona migrations, scrapping de dados, TUI, gRCP, criar alguma aplicação com Fyne, como publicar um pacote e outro tema que pensei foi um conteúdo mais voltado para redes e gostei desse. Então vamos construir um servidor TCP - talvez em outro post podemos fazer uma sala de bate papo. Nesse vamos fazer um servidor TCP que fica esperando conexões de clientes, recebe mensagens e responde um “Olá User”.
Vamos iniciar o servidor na porta 8000 e ficar escutando essa porta em um for infinito. Para trabalhar com essas questões de redes vamos usar as funções do pacote net
. Para abrir a conexão na porte 8000 usamos a função Listen
listener, err := net.Listen("tcp", ":8000")
Lembrar sempre de fechar a conexão com o defer
defer listener.Close()
E a função Accept
do listener
para usar dentro do for para aceitar as conexões
for {
conn, err := listener.Accept()
}
Agrupando todas essas funções, tratando os erros, e adicionando alguns prints temos:
package main
import (
"fmt"
"net"
)
func main() {
listener, err := net.Listen("tcp", ":8000")
if err != nil {
fmt.Println("Erro ao iniciar o servidor:", err)
return
}
defer listener.Close()
fmt.Println("Servidor TCP escutando na porta 8000...")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Erro ao aceitar conexão:", err)
continue
}
fmt.Println("Novo cliente conectado!")
print(conn)
}
}
Agora vamos rodar essa aplicação em um terminal e fazer uma conexão com telnet localhost 8000
. O telnet
permite abrir uma conexão TCP com outro serviço em uma porta específica, diretamente do terminal.
Para rodar o servidor:
go run main.go
Em outro terminal:
telnet localhost 8000
A saída do terminal deve ser a seguinte:
Servidor TCP escutando na porta 8000...
Novo cliente conectado!
(0x546298,0xc000052060)
Então nosso servidor já está escutando e identificando quem faz a conexão. Podemos agora criar uma goroutine para tratar essa conexão específica:
go handleConnection(conn)
Vamos fazer com que a função handleConnection
pergunte para o user qual o nome dele e mandar um “Olá User”
func handleConnection(conn net.Conn) {
defer conn.Close()
response := ">>> Olá! Qual seu nome?\n"
conn.Write([]byte(response))
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("Erro ao ler dados:", err)
return
}
message := string(buffer[:n])
s := fmt.Sprintf(">>> Oi %s e tchau!", message)
conn.Write([]byte(s))
}
Para rodar o servidor:
go run main.go
Em outro terminal:
telnet localhost 8000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
>>> Olá! Qual seu nome?
Victor
>>> Oi Victor
e tchau!Connection closed by foreign host.