View difference between Paste ID: Ns0fv1F5 and cjBtUPWs
SHOW: | | - or go back to the newest paste.
1
package main
2
3
import (
4
	"bufio"
5
	"fmt"
6
	"log"
7
	"net"
8
	"strings"
9
	"sync"
10
)
11
12
type Server struct {
13
	mutex   sync.RWMutex
14
	peers   map[string]*Peer
15
	msgchan chan []byte
16
}
17
18
type Peer struct {
19
	conn   net.Conn
20
	server *Server
21
}
22
23
func NewServer() *Server {
24
	return &Server{
25
		peers:   make(map[string]*Peer),
26
		msgchan: make(chan []byte, 1),
27
	}
28
}
29
30
func NewPeer(conn net.Conn, server *Server) *Peer {
31
	return &Peer{
32
		conn:   conn,
33
		server: server,
34
	}
35
}
36
37
func (s *Server) AddPeer(port string, conn net.Conn) *Peer {
38
39
	s.mutex.Lock()
40
41-
	client := NewPeer(conn, s)
41+
	peer := NewPeer(conn, s)
42
43-
	s.peers[port] = client
43+
	s.peers[port] = peer
44
45
	s.mutex.Unlock()
46
47-
	return client
47+
	return peer
48
}
49
50
func (s *Server) HandlePeer(conn net.Conn) {
51
52
	port := strings.Split((conn).RemoteAddr().String(), ":")[1]
53
54-
	client := &Peer{}
54+
	peer := &Peer{}
55
56
	if _, ok := s.peers[port]; !ok {
57-
		client = s.AddPeer(port, conn)
57+
		peer = s.AddPeer(port, conn)
58
		fmt.Println("added peer")
59
	}
60
61-
	go client.readMsg()
61+
	go peer.readMsg()
62
63-
	go client.writeMsg()
63+
	go peer.writeMsg()
64
}
65
66-
func (c *Peer) readMsg() {
66+
func (p *Peer) readMsg() {
67
68-
	conn := c.conn
68+
	conn := p.conn
69
70
	for {
71
72
		fmt.Println(conn.RemoteAddr().String())
73
74
		msg, err := bufio.NewReader(conn).ReadString('\n')
75
76
		if err != nil {
77
			fmt.Println(err)
78
			continue
79
		}
80
81
		msg = strings.TrimSuffix(msg, "\r\n")
82
83-
		c.server.msgchan <- []byte(msg)
83+
		p.server.msgchan <- []byte(msg)
84
	}
85
}
86
87-
func (c *Peer) MsgPeer(msg []byte) error {
87+
func (p *Peer) MsgPeer(msg []byte) error {
88
89-
	conn := c.conn
89+
	conn := p.conn
90
91-
	fmt.Println(c.conn)
91+
	fmt.Println(p.conn)
92
93
	_, err := conn.Write(msg)
94
95
	if err != nil {
96
		return err
97
	}
98
99
	return nil
100
}
101
102-
func (c *Peer) handleGetPeers() {
102+
func (p *Peer) handleGetPeers() {
103
104-
	for p := range c.server.peers {
104+
	for port := range p.server.peers {
105-
		c.MsgPeer([]byte(p + "\n"))
105+
		p.MsgPeer([]byte(port + "\n"))
106
	}
107
}
108
109-
func (c *Peer) writeMsg() {
109+
func (p *Peer) writeMsg() {
110
111-
	for m := range c.server.msgchan {
111+
	for m := range p.server.msgchan {
112
113
		msg := string(m)
114
115-
		fmt.Printf("msg: %s recieved from: %s\n", msg, c.conn.RemoteAddr().String())
115+
		fmt.Printf("msg: %s recieved from: %s\n", msg, p.conn.RemoteAddr().String())
116
117
		switch msg {
118
		case "get_peers":
119-
			c.handleGetPeers()
119+
			p.handleGetPeers()
120
		}
121
	}
122
}
123
124
func main() {
125
126
	server := NewServer()
127
128
	listener, err := net.Listen("tcp", ":1337")
129
130
	if err != nil {
131
		log.Fatal(err)
132
	}
133
134
	for {
135
136
		conn, err := listener.Accept()
137
138
		if err != nil {
139
			fmt.Println(err)
140
			continue
141
		}
142
143
		go server.HandlePeer(conn)
144
	}
145
}
146