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
}
}