用go写tcp服务器,nc当客户端,实现一个小小聊天室
tcp_server 实现逻辑
主goroutine :绑定ip和端口,监听,广播消息,等待新的连接,若有创建新的goroutine处理连接
broadcaster : 用map记录所有连接的客户端,若有客户端发来消息,将该消息广播给所有在map里的客户端;map还要记录客户端的进入和离开,离开时不要忘记删除map中的键值对。
process : 为每个客户端创建一个channel与服务器进行通信
主要代码
func process(conn net.Conn) {
ch_loc := make(chan string)
go client_w(conn, ch_loc)
id := conn.RemoteAddr().String()
ch_loc <- "我是" + id
message <- id + "进入聊天室..."
entering <- ch_loc
input := bufio.NewScanner(conn)
for input.Scan() {
message <- id + " : " + input.Text()
}
if err := input.Err(); err != nil {
message <- fmt.Sprintf("客户端消息读取失败, err: %v", err)
}
leaving <- ch_loc
message <- id + "离开聊天室..."
conn.Close()
}
func broadcaster() {
//clients 是一个 map 类型的变量,它的键(key)是 client 类型,而值(value)是 bool 类型
clients := make(map[client]bool)
for {
select {
//有客户端发来消息
case msg := <-message:
//向在clients中的所有客户端广播消息
for client_ := range clients {
client_ <- msg
}
//有客户端进入
case client_e := <-entering:
clients[client_e] = true
//有客户端离开
case client_l := <-leaving:
delete(clients, client_l)
close(client_l) //关闭连接
}
}
}
聊天室效果:
服务器端:
客户端: