用go实现并发聊天室

还是老一套,go在网络模块的开发确实是便捷无比,使用goroutine的特性简直是如鱼得水,准备简单的使用go做一个cs的聊天室,整体代码不到一千行,核心代码可能就一两百行,非常通俗易懂,能帮助我们学习goroutine的特性和感受tcp。

源代码:https://github.com/lightTrace/go-learn/tree/chatroom

效果图
服务端:
服务端

客户端jack:
这里写图片描述

客户端pony:
这里写图片描述

一 服务端
server.go
首先主程序端口都是从main开始:

func main() {

    if len(os.Args) == 2 {
        uData = getAllUser(dataFileName) // 用户登录、注册数据初始化

        StartServer(os.Args[1]) // 启动服务端,命令行的第二个参数是端口号

    } else {

        fmt.Println("输入错误!")
    }

}

可以看到启动服务端有两步操作:getAllUser获取用户和StartServer启动服务端

获取用户就是打开本地文件读取的过程,关键是StartServer,StartServer首先createTCP创造一个tcp连接。
然后dataSent启动服务器广播协程:用于广播客户端和服务端交互的所有信息并中转发送给相应客户端,通过“-”分割解析判断;
intoManager是启动管理模块,接收输入的信息来判断是管理员注册还是登录,登录成功后开启管理员管理模块admimManager
connManager启动管理协程,一旦connection通道有连接断开就会通知

然后conn, err := l.Accept()启动无限循环监听连接,然后分别启动recv接收数据和sentData发送数据的协程;

最后开启userAuth验证协程,根据flag判断是注册还是登录

二 客户端
client.go

client就更简单了,建立连接后直接开启数据接收和发送协程,由用户输入数据判断进行具体的操作

猜你喜欢

转载自blog.csdn.net/suresand/article/details/79874823