Advertisement
Guest User

Untitled

a guest
Jun 5th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.41 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "net"
  5.     "log"
  6.     "bufio"
  7.     "fmt"
  8. )
  9.  
  10. func main()  {
  11.     ln, err := net.Listen("tcp", "192.168.1.254:8989")
  12.     if err != nil {
  13.         log.Println(err.Error())
  14.     }
  15.     log.Printf("Start pooling %v", ln)
  16.  
  17.     aconns := make(map[net.Conn]int)
  18.     conns := make(chan net.Conn)
  19.     dconns := make(chan net.Conn)
  20.     msgs := make(chan string)
  21.     names := make(map[net.Conn]string)
  22.     i := 0
  23.  
  24.     go func() {
  25.         for {
  26.             conn, err := ln.Accept()
  27.             if err != nil {
  28.                 log.Println(err.Error())
  29.             }
  30.             conn.Write([]byte("Enter your name\n"))
  31.             rd := bufio.NewReader(conn)
  32.             name, err := rd.ReadString('\n')
  33.             if err != nil {
  34.                 conn.Write([]byte(err.Error()))
  35.                 return
  36.             }
  37.             conn.Write([]byte(fmt.Sprintf("Hello %v", name)))
  38.             names[conn] = name
  39.             conns <- conn
  40.         }
  41.     }()
  42.  
  43.     for {
  44.         select {
  45.         case conn := <- conns:
  46.             aconns[conn] = i
  47.             name := names[conn]
  48.             log.Printf("Client %v %v connected", i, name)
  49.             i++
  50.             go func(conn net.Conn, i int) {
  51.                 rd := bufio.NewReader(conn)
  52.                 for {
  53.                     m, err := rd.ReadString('\n')
  54.                     if err != nil {
  55.                         break
  56.                     }
  57.                     msgs <- fmt.Sprintf("Client %v: %v", i, m)
  58.                 }
  59.                 dconns <- conn
  60.             }(conn, i)
  61.         case msg := <- msgs:
  62.             for conn := range aconns {
  63.                 conn.Write([]byte(msg))
  64.             }
  65.  
  66.         case dconn := <- dconns:
  67.             log.Printf("Client %v left the chat", aconns[dconn])
  68.             delete(aconns, dconn)
  69.             delete(names, dconn)
  70.         }
  71.     }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement