还是老一套,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就更简单了,建立连接后直接开启数据接收和发送协程,由用户输入数据判断进行具体的操作