Skip to content

Instantly share code, notes, and snippets.

@zajann
Created July 6, 2020 06:29
Show Gist options
  • Select an option

  • Save zajann/c9b7f6df6fb302335edc1d1db0838764 to your computer and use it in GitHub Desktop.

Select an option

Save zajann/c9b7f6df6fb302335edc1d1db0838764 to your computer and use it in GitHub Desktop.
Sample TCP Chat Server
package main
import (
"bytes"
"io"
"log"
"net"
)
type BroadCaster struct{}
// implements io.Writer
func (b BroadCaster) Write(p []byte) (int, error) {
var cs []io.Writer
for _, c := range clients {
cs = append(cs, c)
}
n, err := io.Copy(io.MultiWriter(cs...), bytes.NewReader(p))
if err != nil {
return 0, err
}
return int(n), nil
}
var clients map[int]net.Conn
var broadCaster BroadCaster
const listenAddr = "0.0.0.0:5900"
func main() {
clients = make(map[int]net.Conn)
l, err := net.Listen("tcp", listenAddr)
if err != nil {
log.Fatal(err)
}
id := 0
for {
c, err := l.Accept()
if err != nil {
log.Fatal(err)
}
clients[id] = c
go start(id, c)
id++
}
}
func start(id int, c io.ReadWriteCloser) {
log.Printf("New Start: %d\n", id)
errc := make(chan error)
go cp(c, errc)
select {
case _ = <-errc:
c.Close()
delete(clients, id)
}
log.Printf("Close: %d\n", id)
}
func cp(c io.Reader, errc chan<- error) {
_, err := io.Copy(broadCaster, c)
errc <- err
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment