系列文章目录
跟着😽猫猫学Golang,快人一步
系列初开,跟着我走进Go 语言的世界里🌍
系列目录
Golang 从零开始实现多人聊天室(一)服务端监听
Golang 从零开始实现多人聊天室(二)客户端访问
Golang 从零开始实现多人聊天室(三)上线通知与公屏聊天
Golang 从零开始实现多人聊天室(四)离线与用户信息修改
个人博客站点:
CSDN: 😽 猫轻王 https://blog.csdn.net/moer0
个人项目主页:https://github.com/moercat
文章目录
- 系列文章目录
- 😺前言
- 项目代码持续更新
- 一、统一方法包
- 1.使公屏与群聊分离,便于辨认
- 1.通过枚举区分
- 2.整合方法,公屏、群聊、私聊消息统一输出
- 3.修改公屏输出
- 2.更好的管理操作指令
- 1.服务端、客户端统一的方法包
- 2.修改交互的传输方式,字符串 -> 结构体传输
- 3.改造Message的方法
- 3.统一管理结构体
- 😽总结
😺前言
运用 go 里面的net包中的相关方法来实现一个基于tcp的简单多人聊天室
实现
- 加入聊天室
- 广播通知
- 重新登录
- 上线与离线通知
- 公屏聊天
- 群聊
- 单聊
- 退出与注销
建立文件目录进行服务端与客户端区分
服务端代码就写在server 文件夹下的 server 文件中
客户端代码就写在cliemt 文件夹下的 client文件中
项目代码持续更新
多人聊天室
https://github.com/moercat/go-chatroom
此时更新到离线与用户信息修改
一、统一方法包
1.使公屏与群聊分离,便于辨认
由于公屏、群聊、私聊的枚举属性
建立工具包 pkg,枚举目录 enum
1.通过枚举区分
package enum
type Area string
const (
PublicScreen Area = "public_screen" // 公屏
GroupChat Area = "group_chat" //群聊
PrivateChat Area = "private_chat" //私聊
)
var areaMap = map[Area]string{
PublicScreen: "【公屏】",
GroupChat: "【群聊】",
PrivateChat: "【私聊】",
}
// AreaCheck 检查是否是合法区域,默认在公屏聊天
func (a Area) AreaCheck() string {
if area, exist := areaMap[a]; exist {
return area
}
return areaMap[PublicScreen]
}
2.整合方法,公屏、群聊、私聊消息统一输出
package chat
import (
"fmt"
"go-chatroom/pkg/enum"
)
func ShowInOneArea(area enum.Area, args ...string) string {
return fmt.Sprintln(area.AreaCheck(), args)
}
3.修改公屏输出
func (m Message) Read() {
fmt.Printf("%v 用户[%s]: %v \n", time.Now().Format("2006-01-02 15:04:05"), m.Name, m.Msg)
for _, client := range ConnMap {
msg := fmt.Sprintf("%v [%s]: %v", time.Now().Format("2006-01-02 15:04:05"), m.Name, m.Msg)
_, err := client.Conn.Write([]byte(chat.ShowInOneArea(enum.PublicScreen, msg)))
if err != nil {
fmt.Println("client Conn Error")
return
}
}
}
2.更好的管理操作指令
1.服务端、客户端统一的方法包
package enum
import "strconv"
type Operation int
const (
Chat Operation = iota + 1
Logout
Login
UpdateUser
)
func MsgToOperation(msg string) (op Operation) {
opInt, _ := strconv.Atoi(msg)
return Operation(opInt)
}
2.修改交互的传输方式,字符串 -> 结构体传输
old:
msg := m.Name + "|" + strconv.Itoa(m.Op) + "|" + m.Msg
new:
msg, err := json.Marshal(m)
if err != nil {
return
}
3.改造Message的方法
old:
(m Message) Login(conn net.Conn)
new:
Login(conn net.Conn, m Message)
3.统一管理结构体
新增公共结构体包
User
package model
type User struct {
Age string //年龄
Sex string //性别
}
Message
package model
import "go-chatroom/pkg/enum"
type Message struct {
Name string // 用户名
Op enum.Operation // 操作服务
Msg string // 信息内容
}
Client
package model
import "net"
type Client struct {
Conn net.Conn // 连接信息
Name string // 别名
IsQuit bool // 是否退出
User
}
😽总结
🎶感谢您看到这里🎶
从零开始实现一个基于Go的多人在线聊天室,功能包括:单聊、群聊、昵称、上下线通知、聊天日志等等,
通过约定好的格式进行数据的传输,今天我们实现的json格式的传输,用来改善我们非常丑陋的目录结构和传输格式,这将会实用的出现在工作的方方面面。我们下篇博文才会重点放在我们的用户信息是否在重新登陆后还存在与注销的简单使用,通过简单的连接管理能否实现离线与注销的简单区分。多人在线聊天室是我们学习TCP等消息协议最简单的项目,能让我们熟悉服务端与客户端的连接,也能更好的服务于工作的需要。