Pular para o conteúdo principal

victorstein.dev

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.