GO聊天室须知

聊天室

在这里插入图片描述
在这里插入图片描述

一个流程,举个例子

我写的聊天室的功能就是

类似qq群的群发,但是只有一个群,大家都在里边

类似qq私发,只需要一个前缀就行

现在说明一下具体的实现

(都是服务端_关于网络编程这一块)

全局

  1. 创建结构体Client,他作为一个客户端的模型
  2. onlienMap,map型切片存储在线用户
  3. message,全局通道,监听接受每一个来自客户端的消息
type Client struct {
	C    chan string
	Name string
	Addr string
}
var onlineMap map[string]Client
var message = make(chan string)

main

  1. 创建listener接口,监听端口号,一旦收到消息就执行HandlerConnect函数,就是一个go程

函数

func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println("监听错误", err)
		return
	}
	defer listener.Close()
	
	go Manager()
	
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Accept错误", err)
			return
		}
		//启动go程处理客户端数据请求
		go HandlerConnect(conn)
	}
}
  • msg是一个在Hand函数里边定义的一个,但是别的函数也有,自己注意区分一下,大多都是客户端的通道(C)的一个过渡msg := <-message

  • buf是MakeMsg的返回值

  1. WriteMsgToClient,就是实现了在黑窗口(客户端写消息传进Client的C通道)

  2. MakeMsg,这函数有三个参数,返回值是该客户端的名字和发送内容

    • clnt就是客户端结构体
    • msg,就是黑窗口写的消息
    • isWhisper,是否需要私聊
  3. Manage,这个函数两个功能

    • 把在线用户(一开始创建时候就)加进来
    • 并且一旦有内容就打开通道,让客户端的C读取msg,而msg读取message
  4. HandlerConnect,

    • 变量

      • hasDate,用来判断是否超时的通道
      • netAddr,获取客户端地址,因为我的私聊功能不用地址,而用的名字,所以几乎没用
      • clnt,每创建一个客户端就初始化一下
    • onlineMap用客户端名字作为参数,类型是客户端的具体

    • 听到这里下边两行自己就可分析出来了

    • 再往下go程函数自己都能推出来了,只说一些注意点

      • buf[:n-1]不会忘了吧,这是切片,代表的意思是从第一个开始直到n-1个字符,n代表所有的,所以buf代表——(懂了吧?)
      • 下边每一个if就是对应要实现的功能,我看着挺简单的,想要扩展功能就在这里扩展就行了
      • 又一个for,这是为了不关闭客户端,要不就没法聊天了,当然了有几个case判断是否超时,或者退出

到这里就完结了,关于各函数具体,请看仓库注释:Go聊天室

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值