Skip to content

Instantly share code, notes, and snippets.

@matipan
Last active December 1, 2016 23:16
Show Gist options
  • Save matipan/dbc1e26f22adc6ac446022a7907df58c to your computer and use it in GitHub Desktop.
Save matipan/dbc1e26f22adc6ac446022a7907df58c to your computer and use it in GitHub Desktop.
package main
import (
"bufio"
"fmt"
"log"
"net"
)
func main() {
msgs := make(chan string)
conns := make(chan net.Conn)
aconns := make(map[net.Conn]int)
dconns := make(chan net.Conn)
i := 0
ln, err := net.Listen("tcp", "127.0.0.1:8080")
defer ln.Close()
if err != nil {
log.Println(err.Error())
}
// Accept connections for ever
go func() {
for {
conn, err := ln.Accept()
if err != nil {
log.Println(err.Error())
}
conns <- conn
}
}()
for {
select {
// Read incoming connections
case conn := <-conns:
log.Printf("Received new connection, ID = %v\n", i)
aconns[conn] = i
i++
go func(conn net.Conn, i int) {
r := bufio.NewReader(conn)
for {
t, err := r.ReadString('\n')
if err != nil {
log.Println(err.Error())
break
}
msgs <- fmt.Sprintf("Client %v: %v", i, t)
}
dconns <- conn
}(conn, i)
// Read incoming messages
case msg := <-msgs:
for conn := range aconns {
go func(conn net.Conn, msg string) {
_, err := conn.Write([]byte(msg))
if err != nil {
dconns <- conn
}
}(conn, msg)
}
case dconn := <-dconns:
log.Printf("Closing connection %v\n", aconns[dconn])
dconn.Close()
delete(aconns, dconn)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment