[Cliente e servidor socket em Golang com tratamento de sinais.]

Continuando a série de artigos construindo o nosso cliente/servidor vamos adicionar mais um canal no exemplo anterior que será usado para tratar sinais vindos do sistema operacional.

O sistema operacional envia sinais para os programas para executar várias coisas, como o gerenciamento de processos. Por exemplo, quando você pressiona ctrl+c o sistema operacional envia o sinal SIGINT avisando o programa que o usuário quer que ele seja interrompido. 

O comportamento padrão é simplesmente fechar o programa, mas podemos interceptar esse sinal e fazer o que quisermos. No nosso caso vamos apenas finalizar o programa, mas em um sistema real esse recurso poderia ser usado para persistir alguma informação antes de fechar, finalizar outros processos, fechar conexões e arquivos, etc. Esse processo é conhecido como graceful shutdown.

Servidor

Do lado do servidor criamos um canal e informamos o sistema para enviar os canais por esse novo canal. Também foi necessário uma goroutine para ficar esperando o canal.

sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

go func() {
	<-sigs
	fmt.Println("\nShutdown server...")
	os.Exit(0)
}()

Cliente

O cliente foi um pouco mais interessante porque não é necessário criar uma goroutine, como já estamos tratando os canais com select case podemos simplesmente adicionar mais esse canal nos cases e ele será tratado normalmente, assim como os outros canais.

sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

for {
	select {
	case <-sigs:
		fmt.Println("\nDisconnecting...")
		conn.Close()
		os.Exit(0)
		...

Código-fonte

Aqui vai o código-fonte do nosso servidor e cliente.

Vídeos com explicação

Conclusão

Essa mudança do código para adicionar os sinais foi bem pequena, mas é importante. Se o programa será fechado é importante ter certeza que ele esta em um estado conhecido, por exemplo, imagina que seu programa persista dados em um banco de dados, é uma boa ideia esperar que as transações abertas no banco terminem antes de derrubar o programa.

Cesar Gimenes