Last active
December 1, 2016 23:16
-
-
Save matipan/dbc1e26f22adc6ac446022a7907df58c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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