implemented peers communication to send the peersList

This commit is contained in:
arnaucode
2017-11-24 14:23:25 +01:00
parent df1eb59956
commit e0a91e7ffb
6 changed files with 181 additions and 36 deletions

View File

@@ -1,12 +1,10 @@
package main package main
import ( import (
"encoding/json" "bufio"
"fmt" "fmt"
"log" "log"
"net" "net"
"github.com/fatih/color"
) )
func acceptPeers(peer Peer) { func acceptPeers(peer Peer) {
@@ -26,7 +24,7 @@ func acceptPeers(peer Peer) {
newPeer.IP = getIPFromConn(conn) newPeer.IP = getIPFromConn(conn)
newPeer.Port = getPortFromConn(conn) newPeer.Port = getPortFromConn(conn)
newPeer.Conn = conn newPeer.Conn = conn
listPeers = append(listPeers, newPeer) peersList.Peers = append(peersList.Peers, newPeer)
go handleConn(conn) go handleConn(conn)
} }
} }
@@ -37,32 +35,38 @@ func connectToPeer(peer Peer) {
return return
} }
peer.Conn = conn peer.Conn = conn
listPeers = append(listPeers, peer) peersList.Peers = append(peersList.Peers, peer)
go handleConn(conn) go handleConn(conn)
} }
func handleConn(conn net.Conn) { func handleConn(conn net.Conn) {
connRunning := true connRunning := true
log.Println("handling conn: " + conn.RemoteAddr().String()) log.Println("handling conn: " + conn.RemoteAddr().String())
//reply to the conn //reply to the conn, send the peerList
msgB := newMsgBytes("Hi", "New Peer connected") var msg Msg
msg = msg.construct("PeersList", "here my peersList", peersList)
msgB := msg.toBytes()
_, err := conn.Write(msgB) _, err := conn.Write(msgB)
if err != nil {
check(err) check(err)
}
buffer := make([]byte, 1024)
for connRunning { for connRunning {
/*
buffer := make([]byte, 1024)
bytesRead, err := conn.Read(buffer) bytesRead, err := conn.Read(buffer)
*/
newmsg, err := bufio.NewReader(conn).ReadString('\n')
if err != nil { if err != nil {
log.Println(err) log.Println(err)
connRunning = false connRunning = false
} else { } else {
s := string(buffer[0:bytesRead]) /*
fmt.Println(buffer)
fmt.Println(bytesRead)
*/
var msg Msg var msg Msg
err := json.Unmarshal([]byte(s), &msg) //color.Blue(string(buffer[0:bytesRead]))
check(err) //msg = msg.createFromBytes([]byte(string(buffer[0:bytesRead])))
log.Println("[New msg] [Title]: " + msg.Type + " [Content]: " + msg.Content) msg = msg.createFromBytes([]byte(newmsg))
color.Green(msg.Content) messageHandler(conn, msg)
} }
} }
//TODO add that if the peer closed is the p2p server, show a warning message at the peer //TODO add that if the peer closed is the p2p server, show a warning message at the peer

View File

@@ -1,9 +1,15 @@
package main package main
import "log" import (
"log"
"runtime"
)
func check(err error) { func check(err error) {
if err != nil { if err != nil {
_, fn, line, _ := runtime.Caller(1)
log.Println(line)
log.Println(fn)
log.Println(err) log.Println(err)
} }
} }

View File

@@ -2,35 +2,36 @@ package main
import ( import (
"fmt" "fmt"
"math/rand"
"net" "net"
"os" "os"
"strconv"
"time" "time"
"github.com/fatih/color" "github.com/fatih/color"
) )
type Peer struct { type Peer struct {
IP string ID string `json:"id"`
Port string IP string `json:"ip"`
Role string //client or server Port string `json:"port"`
Conn net.Conn Role string `json:"role"` //client or server
} Conn net.Conn `json:"conn"`
type Msg struct {
Type string `json:"type"`
Content string `json:"content"`
} }
var listPeers []Peer
var running bool var running bool
var thisPeerID string
func main() { func main() {
//initialize some vars //initialize some vars
rand.Seed(time.Now().Unix())
running = true running = true
var peer Peer var peer Peer
color.Blue("Starting Peer") color.Blue("Starting Peer")
readConfig("config.json") readConfig("config.json")
peer.ID = strconv.Itoa(randInt(1, 1000)) //0 is reserved for server
peer.IP = config.IP peer.IP = config.IP
peer.Port = config.Port peer.Port = config.Port
peer.Role = "client" peer.Role = "client"
@@ -41,10 +42,17 @@ func main() {
color.Yellow("Running as p2p server") color.Yellow("Running as p2p server")
peer.Role = "server" peer.Role = "server"
peer.Port = config.ServerPort peer.Port = config.ServerPort
peer.ID = "0"
}
}
thisPeerID = peer.ID
peersList.PeerID = peer.ID
fmt.Println(peer)
peersList.Peers = append(peersList.Peers, peer)
fmt.Println(peersList)
if peer.Role == "server" {
go acceptPeers(peer) go acceptPeers(peer)
} }
}
fmt.Println(peer)
if peer.Role == "client" { if peer.Role == "client" {
var newPeer Peer var newPeer Peer
newPeer.IP = config.ServerIP newPeer.IP = config.ServerIP

62
peer/messages.go Normal file
View File

@@ -0,0 +1,62 @@
package main
import (
"encoding/json"
"fmt"
"log"
"net"
"time"
"github.com/fatih/color"
)
type Msg struct {
Type string `json:"type"`
Date time.Time `json:"date"`
Content string `json:"content"`
PeersList PeersList `json:"peerslist"`
}
func messageHandler(conn net.Conn, msg Msg) {
log.Println("[New msg]")
log.Println(msg)
switch msg.Type {
case "Hi":
color.Yellow(msg.Type)
color.Green(msg.Content)
break
case "PeersList":
color.Blue("newPeerslist")
fmt.Println(msg.PeersList)
time.Sleep(1000 * time.Millisecond)
updatePeersList(conn, msg.PeersList)
propagatePeersList()
printPeersList()
default:
log.Println("Msg.Type not supported")
break
}
}
func (msg Msg) construct(msgtype string, msgcontent string, peersList PeersList) Msg {
msg.Type = msgtype
msg.Content = msgcontent
msg.PeersList = peersList
msg.Date = time.Now()
return msg
}
func (msg Msg) toBytes() []byte {
msgS, err := json.Marshal(msg)
check(err)
l := string(msgS) + "\n"
r := []byte(l)
return r
}
func (msg Msg) createFromBytes(bytes []byte) Msg {
err := json.Unmarshal(bytes, &msg)
check(err)
return msg
}

64
peer/peersList.go Normal file
View File

@@ -0,0 +1,64 @@
package main
import (
"fmt"
"net"
"time"
"github.com/fatih/color"
)
type PeersList struct {
PeerID string
Peers []Peer `json:"peerslist"`
Date time.Time `json:"date"`
}
//var peersList []Peer
var peersList PeersList
func peerIsInPeersList(p Peer, pl []Peer) int {
r := -1
for i, peer := range pl {
if peer.IP+":"+peer.Port == p.IP+":"+p.Port {
r = i
}
}
return r
}
func updatePeersList(conn net.Conn, newPeersList PeersList) {
for _, peer := range newPeersList.Peers {
if getIPPortFromConn(conn) == peer.IP+":"+peer.Port {
peer.ID = newPeersList.PeerID
}
i := peerIsInPeersList(peer, peersList.Peers)
if i == -1 {
peersList.Peers = append(peersList.Peers, peer)
} else {
fmt.Println(peersList.Peers[i])
peersList.Peers[i].ID = peer.ID
}
}
}
//send the peersList to all the peers except the peer that has send the peersList
func propagatePeersList() {
for _, peer := range peersList.Peers {
if peer.Conn != nil {
var msg Msg
msg = msg.construct("PeersList", "here my peersList", peersList)
msgB := msg.toBytes()
_, err := peer.Conn.Write(msgB)
check(err)
}
}
}
func printPeersList() {
fmt.Println("")
color.Green("PEERSLIST:")
color.Green("thisPeerId: " + thisPeerID)
for _, peer := range peersList.Peers {
fmt.Println(peer)
}
fmt.Println("")
}

View File

@@ -1,18 +1,15 @@
package main package main
import ( import (
"encoding/json" "math/rand"
"net" "net"
"strings" "strings"
) )
func newMsgBytes(msgtype string, msgcontent string) []byte { func getIPPortFromConn(conn net.Conn) string {
var msg Msg ip := getIPFromConn(conn)
msg.Type = msgtype port := getPortFromConn(conn)
msg.Content = msgcontent return ip + ":" + port
msgS, err := json.Marshal(msg)
check(err)
return msgS
} }
func getIPFromConn(conn net.Conn) string { func getIPFromConn(conn net.Conn) string {
s := conn.RemoteAddr().String() s := conn.RemoteAddr().String()
@@ -26,3 +23,7 @@ func getPortFromConn(conn net.Conn) string {
s = strings.Trim(s, ":") s = strings.Trim(s, ":")
return s return s
} }
func randInt(min int, max int) int {
r := rand.Intn(max-min) + min
return r
}