Created
February 4, 2016 13:48
-
-
Save Kielan/98706aaf5dc0be9d6fbe 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
//more complete chat IMO | |
package main | |
import ( | |
"bufio" | |
"fmt" | |
"log" | |
"net" | |
) | |
type client chan<- string // an outgoing message channel | |
var ( | |
entering = make(chan client) | |
leaving = make(chan client) | |
messages = make(chan string) // all incoming client messages | |
) | |
func broadcaster() { | |
clients := make(map[client]bool) // all connected clients | |
for { | |
select { | |
case msg := <-messages: | |
// Broadcast incoming message to all | |
// clients' outgoing message channels. | |
for cli := range clients { | |
cli <- msg | |
} | |
case cli := <-entering: | |
clients[cli] = true | |
case cli := <-leaving: | |
delete(clients, cli) | |
close(cli) | |
} | |
} | |
} | |
func handleConn(conn net.Conn) { | |
ch := make(chan string) // outgoing client messages | |
go clientWriter(conn, ch) | |
who := conn.RemoteAddr().String() | |
ch <- "You are " + who | |
messages <- who + " has arrived" | |
entering <- ch | |
input := bufio.NewScanner(conn) | |
for input.Scan() { | |
messages <- who + ": " + input.Text() | |
} | |
// NOTE: ignoring potential errors from input.Err() | |
leaving <- ch | |
messages <- who + " has left" | |
conn.Close() | |
} | |
func clientWriter(conn net.Conn, ch <-chan string) { | |
for msg := range ch { | |
fmt.Fprintln(conn, msg) // NOTE: ignoring network errors | |
} | |
} | |
func main() { | |
listener, err := net.Listen("tcp", "localhost:8080") | |
if err != nil { | |
log.Fatal(err) | |
} | |
go broadcaster() | |
for { | |
conn, err := listener.Accept() | |
if err != nil { | |
log.Print(err) | |
continue | |
} | |
go handleConn(conn) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment