聊天室
一个流程,举个例子
我写的聊天室的功能就是
类似qq群的群发,但是只有一个群,大家都在里边
类似qq私发,只需要一个前缀就行
现在说明一下具体的实现
(都是服务端_关于网络编程这一块)
全局
- 创建结构体Client,他作为一个客户端的模型
- onlienMap,map型切片存储在线用户
- message,全局通道,监听接受每一个来自客户端的消息
type Client struct {
C chan string
Name string
Addr string
}
var onlineMap map[string]Client
var message = make(chan string)
main
- 创建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的返回值
-
WriteMsgToClient,就是实现了在黑窗口(客户端写消息传进Client的C通道)
-
MakeMsg,这函数有三个参数,返回值是该客户端的名字和发送内容
- clnt就是客户端结构体
- msg,就是黑窗口写的消息
- isWhisper,是否需要私聊
-
Manage,这个函数两个功能
- 把在线用户(一开始创建时候就)加进来
- 并且一旦有内容就打开通道,让客户端的C读取msg,而msg读取message
-
HandlerConnect,
-
变量
- hasDate,用来判断是否超时的通道
- netAddr,获取客户端地址,因为我的私聊功能不用地址,而用的名字,所以几乎没用
- clnt,每创建一个客户端就初始化一下
-
onlineMap用客户端名字作为参数,类型是客户端的具体
-
听到这里下边两行自己就可分析出来了
-
再往下go程函数自己都能推出来了,只说一些注意点
- buf[:n-1]不会忘了吧,这是切片,代表的意思是从第一个开始直到n-1个字符,n代表所有的,所以buf代表——(懂了吧?)
- 下边每一个if就是对应要实现的功能,我看着挺简单的,想要扩展功能就在这里扩展就行了
- 又一个for,这是为了不关闭客户端,要不就没法聊天了,当然了有几个case判断是否超时,或者退出
-
到这里就完结了,关于各函数具体,请看仓库注释:Go聊天室