main.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // Skeleton to part 7 of the Whispering Gophers code lab.
  2. //
  3. // This program extends part 6 by adding a Peers type.
  4. // The rest of the code is left as-is, so functionally there is no change.
  5. //
  6. // However we have added a peers_test.go file, so that running
  7. // go test
  8. // from the package directory will test your implementation of the Peers type.
  9. //
  10. package main
  11. import (
  12. "bufio"
  13. "encoding/json"
  14. "flag"
  15. "fmt"
  16. "log"
  17. "net"
  18. "os"
  19. "sync"
  20. "code.google.com/p/whispering-gophers/util"
  21. )
  22. var (
  23. peerAddr = flag.String("peer", "", "peer host:port")
  24. self string
  25. )
  26. type Message struct {
  27. Addr string
  28. Body string
  29. }
  30. func main() {
  31. flag.Parse()
  32. l, err := util.Listen()
  33. if err != nil {
  34. log.Fatal(err)
  35. }
  36. self = l.Addr().String()
  37. log.Println("Listening on", self)
  38. go dial(*peerAddr)
  39. go readInput()
  40. for {
  41. c, err := l.Accept()
  42. if err != nil {
  43. log.Fatal(err)
  44. }
  45. go serve(c)
  46. }
  47. }
  48. type Peers struct {
  49. m map[string]chan<- Message
  50. mu sync.RWMutex
  51. }
  52. // Add creates and returns a new channel for the given peer address.
  53. // If an address already exists in the registry, it returns nil.
  54. func (p *Peers) Add(addr string) <-chan Message {
  55. // TODO: Take the write lock on p.mu. Unlock it before returning (using defer).
  56. defer p.mu.Unlock()
  57. p.mu.Lock()
  58. // TODO: Check if the address is already in the peers map under the key addr.
  59. if _, ok := p.m[addr] ; ok {
  60. // TODO: If it is, return nil.
  61. return nil
  62. }
  63. // TODO: Make a new channel of messages
  64. messages := make(chan Message)
  65. // TODO: Add it to the peers map
  66. p.m[addr] = messages
  67. // TODO: Return the newly created channel.
  68. return messages
  69. }
  70. // Remove deletes the specified peer from the registry.
  71. func (p *Peers) Remove(addr string) {
  72. // TODO: Take the write lock on p.mu. Unlock it before returning (using defer).
  73. defer p.mu.Unlock()
  74. p.mu.Lock()
  75. // TODO: Delete the peer from the peers map.
  76. delete(p.m, addr)
  77. }
  78. // List returns a slice of all active peer channels.
  79. func (p *Peers) List() []chan<- Message {
  80. // TODO: Take the read lock on p.mu. Unlock it before returning (using defer).
  81. defer p.mu.RUnlock()
  82. p.mu.RLock()
  83. // TODO: Declare a slice of chan<- Message.
  84. s := make([]chan <- Message, 0)
  85. /* TODO: Iterate over the map using range */
  86. for _, v := range p.m {
  87. // TODO: Append each channel into the slice.
  88. s = append(s, v)
  89. }
  90. // TODO: Return the slice.
  91. return s
  92. }
  93. func serve(c net.Conn) {
  94. defer c.Close()
  95. d := json.NewDecoder(c)
  96. for {
  97. var m Message
  98. err := d.Decode(&m)
  99. if err != nil {
  100. log.Println(err)
  101. return
  102. }
  103. fmt.Printf("%#v\n", m)
  104. }
  105. }
  106. var peer = make(chan Message)
  107. func readInput() {
  108. s := bufio.NewScanner(os.Stdin)
  109. for s.Scan() {
  110. m := Message{
  111. Addr: self,
  112. Body: s.Text(),
  113. }
  114. peer <- m
  115. }
  116. if err := s.Err(); err != nil {
  117. log.Fatal(err)
  118. }
  119. }
  120. func dial(addr string) {
  121. c, err := net.Dial("tcp", addr)
  122. if err != nil {
  123. log.Println(addr, err)
  124. return
  125. }
  126. defer c.Close()
  127. e := json.NewEncoder(c)
  128. for m := range peer {
  129. err := e.Encode(m)
  130. if err != nil {
  131. log.Println(addr, err)
  132. return
  133. }
  134. }
  135. }