用go实现tcp_server

用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) //关闭连接
		}
	}
}

聊天室效果:

服务器端:

客户端:

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值