parent
08d9375b75
commit
ce9a321efb
@ -0,0 +1,164 @@ |
|||||||
|
// https://gist.github.com/kenshinx/5796276
|
||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"bufio" |
||||||
|
"flag" |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"log" |
||||||
|
"net" |
||||||
|
"os" |
||||||
|
"strconv" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
// Consts
|
||||||
|
const ( |
||||||
|
Message = "Ping" |
||||||
|
StopCharacter = "\r\n\r\n" |
||||||
|
) |
||||||
|
|
||||||
|
var received map[int]int |
||||||
|
|
||||||
|
// SocketClient code.
|
||||||
|
func SocketClient(ip, message string, port int) (res string) { |
||||||
|
addr := strings.Join([]string{ip, strconv.Itoa(port)}, ":") |
||||||
|
conn, err := net.Dial("tcp", addr) |
||||||
|
|
||||||
|
defer conn.Close() |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
log.Fatalln(err) |
||||||
|
} |
||||||
|
|
||||||
|
conn.Write([]byte(message)) |
||||||
|
conn.Write([]byte(StopCharacter)) |
||||||
|
log.Printf("Send: %s", Message) |
||||||
|
|
||||||
|
buff := make([]byte, 1024) |
||||||
|
n, _ := conn.Read(buff) |
||||||
|
res = string(buff[:n]) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
// Send code.
|
||||||
|
func Send(port int, message string, ch chan int) (returnMessage string) { |
||||||
|
ip := "127.0.0.1" |
||||||
|
returnMessage = SocketClient(ip, message, port) |
||||||
|
ch <- port |
||||||
|
fmt.Println(returnMessage) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
func checkError(err error) { |
||||||
|
if err != nil { |
||||||
|
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) |
||||||
|
os.Exit(1) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func convertIntoInts(data string) []int { |
||||||
|
var res = []int{} |
||||||
|
items := strings.Split(data, " ") |
||||||
|
for _, value := range items { |
||||||
|
intValue, err := strconv.Atoi(value) |
||||||
|
checkError(err) |
||||||
|
res = append(res, intValue) |
||||||
|
} |
||||||
|
return res |
||||||
|
} |
||||||
|
|
||||||
|
// Receive request.
|
||||||
|
func handler(conn net.Conn) { |
||||||
|
|
||||||
|
defer conn.Close() |
||||||
|
|
||||||
|
var ( |
||||||
|
buf = make([]byte, 1024) |
||||||
|
r = bufio.NewReader(conn) |
||||||
|
w = bufio.NewWriter(conn) |
||||||
|
) |
||||||
|
|
||||||
|
receivedMessage := "" |
||||||
|
ILOOP: |
||||||
|
for { |
||||||
|
n, err := r.Read(buf) |
||||||
|
data := string(buf[:n]) |
||||||
|
|
||||||
|
receivedMessage += data |
||||||
|
|
||||||
|
switch err { |
||||||
|
case io.EOF: |
||||||
|
break ILOOP |
||||||
|
case nil: |
||||||
|
log.Println("Receive:", data) |
||||||
|
if isTransportOver(data) { |
||||||
|
break ILOOP |
||||||
|
} |
||||||
|
|
||||||
|
default: |
||||||
|
log.Fatalf("Receive data failed:%s", err) |
||||||
|
return |
||||||
|
} |
||||||
|
} |
||||||
|
receivedMessage = strings.TrimSpace(receivedMessage) |
||||||
|
ports := convertIntoInts(receivedMessage) |
||||||
|
ch := make(chan int) |
||||||
|
for i, port := range ports { |
||||||
|
go Send(port, strconv.Itoa(i), ch) |
||||||
|
} |
||||||
|
count := 0 |
||||||
|
for count < len(ports) { |
||||||
|
fmt.Println(<-ch) |
||||||
|
count++ |
||||||
|
} |
||||||
|
w.Write([]byte(Message)) |
||||||
|
w.Flush() |
||||||
|
log.Printf("Send: %s", Message) |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
func isTransportOver(data string) (over bool) { |
||||||
|
over = strings.HasSuffix(data, "\r\n\r\n") |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
// SocketServer for leader.
|
||||||
|
func SocketServer(port int) { |
||||||
|
listen, err := net.Listen("tcp4", ":"+strconv.Itoa(port)) |
||||||
|
defer listen.Close() |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("Socket listen port %d failed,%s", port, err) |
||||||
|
os.Exit(1) |
||||||
|
} |
||||||
|
log.Printf("Begin listen port: %d", port) |
||||||
|
|
||||||
|
for { |
||||||
|
conn, err := listen.Accept() |
||||||
|
if err != nil { |
||||||
|
log.Fatalln(err) |
||||||
|
continue |
||||||
|
} |
||||||
|
go handler(conn) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func main() { |
||||||
|
// ports := convertIntoPorts("1 2 3")
|
||||||
|
// fmt.Println(ports)
|
||||||
|
// os.Exit(0)
|
||||||
|
port := flag.Int("port", 0, "port number.") |
||||||
|
flag.Parse() |
||||||
|
if *port == 0 { |
||||||
|
var err error |
||||||
|
*port, err = strconv.Atoi(os.Getenv("LEADER_PORT")) |
||||||
|
if err != nil { |
||||||
|
fmt.Fprintf(os.Stderr, "No port provided.") |
||||||
|
os.Exit(1) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fmt.Println("I'm a leader node") |
||||||
|
SocketServer(*port) |
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"bufio" |
||||||
|
"flag" |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"log" |
||||||
|
"net" |
||||||
|
"os" |
||||||
|
"strconv" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
Message = "Pong" |
||||||
|
StopCharacter = "\r\n\r\n" |
||||||
|
) |
||||||
|
|
||||||
|
func SocketServer(port int) { |
||||||
|
|
||||||
|
listen, err := net.Listen("tcp4", ":"+strconv.Itoa(port)) |
||||||
|
defer listen.Close() |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("Socket listen port %d failed,%s", port, err) |
||||||
|
os.Exit(1) |
||||||
|
} |
||||||
|
log.Printf("Begin listen port: %d", port) |
||||||
|
|
||||||
|
for { |
||||||
|
conn, err := listen.Accept() |
||||||
|
if err != nil { |
||||||
|
log.Fatalln(err) |
||||||
|
continue |
||||||
|
} |
||||||
|
go handler(conn) |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
func handler(conn net.Conn) { |
||||||
|
|
||||||
|
defer conn.Close() |
||||||
|
|
||||||
|
var ( |
||||||
|
buf = make([]byte, 1024) |
||||||
|
r = bufio.NewReader(conn) |
||||||
|
w = bufio.NewWriter(conn) |
||||||
|
) |
||||||
|
|
||||||
|
ILOOP: |
||||||
|
for { |
||||||
|
n, err := r.Read(buf) |
||||||
|
data := string(buf[:n]) |
||||||
|
|
||||||
|
switch err { |
||||||
|
case io.EOF: |
||||||
|
break ILOOP |
||||||
|
case nil: |
||||||
|
log.Println("Receive:", data) |
||||||
|
if isTransportOver(data) { |
||||||
|
break ILOOP |
||||||
|
} |
||||||
|
|
||||||
|
default: |
||||||
|
log.Fatalf("Receive data failed:%s", err) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
w.Write([]byte(Message)) |
||||||
|
w.Flush() |
||||||
|
log.Printf("Send: %s", Message) |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
func isTransportOver(data string) (over bool) { |
||||||
|
over = strings.HasSuffix(data, "\r\n\r\n") |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
func main() { |
||||||
|
port := flag.Int("port", 0, "port number.") |
||||||
|
flag.Parse() |
||||||
|
if *port == 0 { |
||||||
|
fmt.Fprintf(os.Stderr, "No port provided") |
||||||
|
os.Exit(1) |
||||||
|
} |
||||||
|
fmt.Println("I'm a slave node with port %d.", *port) |
||||||
|
SocketServer(*port) |
||||||
|
} |
Loading…
Reference in new issue