Skip to content

Instantly share code, notes, and snippets.

@alihammad-gist
Last active December 25, 2015 20:09
Show Gist options
  • Save alihammad-gist/7032396 to your computer and use it in GitHub Desktop.
Save alihammad-gist/7032396 to your computer and use it in GitHub Desktop.
package main
import (
"bufio"
"fmt"
"log"
"net"
"sync"
)
type Conns struct {
mu sync.Mutex
nodes map[string]net.Conn
}
func (c *Conns) AddNode(addr string, conn net.Conn) {
if c.nodes == nil {
c.nodes = make(map[string]net.Conn)
}
c.mu.Lock()
defer c.mu.Unlock()
c.nodes[addr] = conn
}
func (c *Conns) DelNode(addr string) {
c.mu.Lock()
defer c.mu.Unlock()
if _, ok := c.nodes[addr]; ok {
delete(c.nodes, addr)
}
}
func (c *Conns) Map(function func(net.Conn)) {
// c.mu.Lock()
// defer c.mu.Unlock()
for _, conn := range c.nodes {
function(conn)
}
}
func main() {
l, err := net.Listen("tcp", ":9898")
conns := Conns{}
if err != nil {
log.Fatal(err)
}
for {
conn, err := l.Accept()
if err != nil {
log.Fatal(err)
}
conns.AddNode(conn.RemoteAddr().String(), conn)
conns.Map(func(rCon net.Conn) {
fmt.Fprintf(rCon, "%s joined the chat \n", conn.RemoteAddr().String())
})
go func() {
defer conns.DelNode(conn.RemoteAddr().String())
scanr := bufio.NewScanner(conn)
for scanr.Scan() {
conns.Map(func(rConn net.Conn) {
msgBytes := scanr.Bytes()
if string(msgBytes) == "/exit" {
conn.Close()
return
}
if rConn.RemoteAddr().String() != conn.RemoteAddr().String() {
rConn.Write(msgBytes)
rConn.Write([]byte("\n"))
}
})
}
}()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment