Go实现简易聊天室(群聊)

参考: 基于websocket的聊天室,可进一步参考: (1) (2)

闲着无聊ing~ 一直想着能用go整一些好玩的小工具,想着想着突然想到实现一个简易的群聊工具,然后看了上面几个大佬文章,边看边动手实现下...

聊天室的组成

聊天室分为两个部分,分别是:

    服务端 客户端

然后,一般情况下我们互相聊天使用的都只是客户端而已,服务端只是起到调度的作用。

信息发送与接收的流程

假设我们有 服务端(S) 客户端(C1) 客户端(C2) 客户端(C3)并且 S 已经 与 C1 C2 C3 建立了连接。

理论上的流程是这样的:

  1. C1 向 S 发出信息
  2. S 接收到信息
  3. S 将接收到的信息广播给 C2 C3
  4. 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端:

经验分享 程序员 微信小程序 职场和发展