Skip to content

Instantly share code, notes, and snippets.

@eduardonunesp

eduardonunesp/chat.go

Forked from gmarik/chat.go
Last active Sep 22, 2015
Embed
What would you like to do?
package main
import (
"bufio"
"net"
)
type Client struct {
incoming chan string
outgoing chan string
reader *bufio.Reader
writer *bufio.Writer
}
func (client *Client) Read() {
for {
if line, err := client.reader.ReadString('\n'); err != nil {
break
} else {
client.incoming <- line
}
}
}
func (client *Client) Write() {
for data := range client.outgoing {
client.writer.WriteString(data)
client.writer.Flush()
}
}
func (client *Client) Listen() {
go client.Read()
go client.Write()
}
func NewClient(connection net.Conn) *Client {
writer := bufio.NewWriter(connection)
reader := bufio.NewReader(connection)
client := &Client{
incoming: make(chan string),
outgoing: make(chan string),
reader: reader,
writer: writer,
}
client.Listen()
return client
}
type ChatRoom struct {
clients []*Client
joins chan net.Conn
incoming chan string
outgoing chan string
}
func (chatRoom *ChatRoom) Broadcast(data string) {
for _, client := range chatRoom.clients {
client.outgoing <- data
}
}
func (chatRoom *ChatRoom) Join(connection net.Conn) {
client := NewClient(connection)
chatRoom.clients = append(chatRoom.clients, client)
go func() {
for {
chatRoom.incoming <- <-client.incoming
}
}()
}
func (chatRoom *ChatRoom) Listen() {
go func() {
for {
select {
case data := <-chatRoom.incoming:
chatRoom.Broadcast(data)
case conn := <-chatRoom.joins:
chatRoom.Join(conn)
}
}
}()
}
func NewChatRoom() *ChatRoom {
chatRoom := &ChatRoom{
make([]*Client, 0),
make(chan net.Conn),
make(chan string),
make(chan string),
}
chatRoom.Listen()
return chatRoom
}
func main() {
chatRoom := NewChatRoom()
listener, _ := net.Listen("tcp", "127.0.0.1:6666")
for {
conn, _ := listener.Accept()
chatRoom.joins <- conn
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.