Mudanças entre as edições de "Go: Programação Distribuída"

De Aulas
Linha 103: Linha 103:
 
myTime := t.Format(time.RFC3339) + "\n"
 
myTime := t.Format(time.RFC3339) + "\n"
 
c.Write([]byte(myTime)) // Escreve no buffer de escrita para o cliente
 
c.Write([]byte(myTime)) // Escreve no buffer de escrita para o cliente
 +
}
 +
}
 +
</syntaxhighlight>
 +
 +
= TCP Servidor com múltiplas conexões =
 +
 +
<syntaxhighlight lang=go>
 +
package main
 +
 +
import (
 +
"bufio"
 +
"fmt"
 +
"net"
 +
"os"
 +
"strings"
 +
"time"
 +
)
 +
 +
func child(conn net.Conn) {
 +
addr := conn.RemoteAddr() // Pega o endereço do cliente
 +
fmt.Println(addr, ": connected...")
 +
defer fmt.Println(addr, ": disconnected...")
 +
defer conn.Close() // Ao final, fecha a conexão
 +
 +
for {
 +
// Recebe informações no buffer de leitura
 +
netData, err := bufio.NewReader(conn).ReadString('\n')
 +
if err != nil {
 +
fmt.Println(err)
 +
return
 +
}
 +
// Se for EXIT, fecha fecha a conexão
 +
if strings.ToUpper(strings.TrimSpace(string(netData))) == "EXIT" {
 +
fmt.Println(addr, ": exit...")
 +
return
 +
}
 +
// Mostra a mensagem na tela e envia de volta o horário
 +
fmt.Print(addr, " : ", string(netData))
 +
t := time.Now()
 +
myTime := t.Format(time.RFC3339) + "\n"
 +
conn.Write([]byte(myTime)) // Escreve no buffer de escrita para o cliente
 +
}
 +
}
 +
 +
func main() {
 +
arguments := os.Args    // Pega a porta como argumento da linha de comando
 +
if len(arguments) == 1 { // Se não for passado a porta dá erro
 +
fmt.Println("Enter with port number in argument")
 +
return
 +
}
 +
l, err := net.Listen("tcp", ":"+arguments[1]) // Configura uma porta TCP
 +
if err != nil {
 +
fmt.Println(err)
 +
return
 +
}
 +
defer l.Close() // Ao final, fecha a conexão.
 +
fmt.Println("TCP Server initialized at port", arguments[1])
 +
 +
for {
 +
c, err := l.Accept() // Aguarda o próximo cliente se conectar
 +
if err != nil {
 +
fmt.Println(err)
 +
return
 +
}
 +
go child(c) // Passa a conexão para uma gorotine gerenciar
 
}
 
}
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Edição das 14h00min de 4 de novembro de 2021

TCP Cliente

Efetua uma conexão TCP com um servidor. Aguarda o usuário digitar mensagens e dar ENTER. Para saír, basta digitar EXIT.

 1package main
 2
 3import (
 4	"bufio"
 5	"fmt"
 6	"net"
 7	"os"
 8	"strings"
 9)
10
11func main() {
12	arguments := os.Args     // Pega os argumentos da linha de comando
13	if len(arguments) == 1 { // Se não tiver argumentos retorna erro
14		fmt.Println("Enter with arguments host:port.")
15		return
16	}
17
18	// Usa os argumentos e se conecta ao servidor host:port
19	c, err := net.Dial("tcp", arguments[1])
20	if err != nil {
21		fmt.Println(err)
22		return
23	}
24	defer c.Close()
25	fmt.Print("Digit your message and press key ENTER to send.")
26	fmt.Println("To exit, digit EXIT and press key exit.")
27	for {
28		reader := bufio.NewReader(os.Stdin) // Prepara o buffer de leitura
29		fmt.Print("MSG: ")
30		text, _ := reader.ReadString('\n') // Le um texto do teclado
31		fmt.Fprintf(c, text+"\n")          // Envia o texto pela conexão
32
33		message, _ := bufio.NewReader(c).ReadString('\n') // Aguarda resposta do servidor
34		fmt.Print("RCV: " + message)
35		// Se a resposta for EXIT, fecha a conexão e o cliente
36		if strings.ToUpper(strings.TrimSpace(string(text))) == "EXIT" {
37			fmt.Println("TCP client exiting...")
38			return
39		}
40	}
41}

TCP Servidor Simples

Inicia o servidor e fica aguardando um cliente. Recebe as mensagens do cliente. Quando o cliente envia EXIT, fecha o servidor e a conexão.

 1package main
 2
 3import (
 4	"bufio"
 5	"fmt"
 6	"net"
 7	"os"
 8	"strings"
 9	"time"
10)
11
12func main() {
13	arguments := os.Args     // Pega a porta como argumento da linha de comando
14	if len(arguments) == 1 { // Se não for passado a porta dá erro
15		fmt.Println("Enter with port number in argument")
16		return
17	}
18	l, err := net.Listen("tcp", ":"+arguments[1]) // Inicia a conexão TCP na porta
19	if err != nil {
20		fmt.Println(err)
21		return
22	}
23	defer l.Close() // Ao final, fecha a conexão.
24	fmt.Println("TCP Server initialized at port", arguments[1])
25
26	c, err := l.Accept() // Fica aguardando um cliente se conectar
27	if err != nil {
28		fmt.Println(err)
29		return
30	}
31	fmt.Println("Client connected...")
32
33	for { // Laço eterno
34		// Recebe informações no buffer de leitura
35		netData, err := bufio.NewReader(c).ReadString('\n')
36		if err != nil {
37			fmt.Println(err)
38			return
39		}
40		// Se for EXT, fecha o sevidor, mas fecha a conexão antes
41		if strings.ToUpper(strings.TrimSpace(string(netData))) == "EXIT" {
42			fmt.Println("TCP Server terminated...")
43			return
44		}
45
46		// Mostra a mensagem na tela e envia de volta o horário
47		fmt.Print(": ", string(netData))
48		t := time.Now()
49		myTime := t.Format(time.RFC3339) + "\n"
50		c.Write([]byte(myTime)) // Escreve no buffer de escrita para o cliente
51	}
52}

TCP Servidor com múltiplas conexões

package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
	"time"
)

func child(conn net.Conn) {
	addr := conn.RemoteAddr() // Pega o endereço do cliente
	fmt.Println(addr, ": connected...")
	defer fmt.Println(addr, ": disconnected...")
	defer conn.Close() // Ao final, fecha a conexão

	for {
		// Recebe informações no buffer de leitura
		netData, err := bufio.NewReader(conn).ReadString('\n')
		if err != nil {
			fmt.Println(err)
			return
		}
		// Se for EXIT, fecha fecha a conexão
		if strings.ToUpper(strings.TrimSpace(string(netData))) == "EXIT" {
			fmt.Println(addr, ": exit...")
			return
		}
		// Mostra a mensagem na tela e envia de volta o horário
		fmt.Print(addr, " : ", string(netData))
		t := time.Now()
		myTime := t.Format(time.RFC3339) + "\n"
		conn.Write([]byte(myTime)) // Escreve no buffer de escrita para o cliente
	}
}

func main() {
	arguments := os.Args     // Pega a porta como argumento da linha de comando
	if len(arguments) == 1 { // Se não for passado a porta dá erro
		fmt.Println("Enter with port number in argument")
		return
	}
	l, err := net.Listen("tcp", ":"+arguments[1]) // Configura uma porta TCP
	if err != nil {
		fmt.Println(err)
		return
	}
	defer l.Close() // Ao final, fecha a conexão.
	fmt.Println("TCP Server initialized at port", arguments[1])

	for {
		c, err := l.Accept() // Aguarda o próximo cliente se conectar
		if err != nil {
			fmt.Println(err)
			return
		}
		go child(c) // Passa a conexão para uma gorotine gerenciar
	}
}