Go实现简易聊天室(群聊)
参考: 基于websocket的聊天室,可进一步参考: (1) (2)
闲着无聊ing~ 一直想着能用go整一些好玩的小工具,想着想着突然想到实现一个简易的群聊工具,然后看了上面几个大佬文章,边看边动手实现下...
聊天室的组成
聊天室分为两个部分,分别是:
-
服务端 客户端
然后,一般情况下我们互相聊天使用的都只是客户端而已,服务端只是起到调度的作用。
信息发送与接收的流程
假设我们有 服务端(S) 客户端(C1) 客户端(C2) 客户端(C3)并且 S 已经 与 C1 C2 C3 建立了连接。
理论上的流程是这样的:
- C1 向 S 发出信息
- S 接收到信息
- S 将接收到的信息广播给 C2 C3
- C2 C3 接收信息
服务端代码
客户端代码
package main import ( "bufio" "fmt" "net" "os" ) // 用户名 var loginName string // 本机连接 var selfConnect *net.TCPConn // 读取行文本 var reader = bufio.NewReader(os.Stdin) // 建立连接 func connect(addr string) { tcpAddr, _ := net.ResolveTCPAddr("tcp", addr) // 使用tcp con, err := net.DialTCP("tcp", nil, tcpAddr) // 拨号:主动向server建立连接 selfConnect = con if err != nil { fmt.Println("连接服务器失败") os.Exit(1) } go msgSender() go msgReceiver() } // 消息接收器 func msgReceiver() { buff := make([]byte, 2048) for { len, _ := selfConnect.Read(buff) // 从建立连接的缓冲区读消息 fmt.Println(string(buff[:len])) } } // 消息发送器 func msgSender() { for { bMsg, _, _ := reader.ReadLine() bMsg = []byte(loginName + " : " + string(bMsg)) selfConnect.Write(bMsg) // 发消息 } } // 初始化 func initGroupChatClient() { fmt.Println("请问您怎么称呼?") bName, _, _ := reader.ReadLine() loginName = string(bName) connect("127.0.0.1:1801") select {} } func main() { initGroupChatClient() }
运行结果展示:
server端:
client端: