Golang 从零开始实现多人聊天室(五)开发前奏-目录结构优化
阿里云国际版折扣https://www.yundadi.com |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
系列文章目录
跟着猫猫学Golang快人一步
系列初开跟着我走进Go 语言的世界里
系列目录
Golang 从零开始实现多人聊天室一服务端监听
Golang 从零开始实现多人聊天室二客户端访问
Golang 从零开始实现多人聊天室三上线通知与公屏聊天
Golang 从零开始实现多人聊天室四离线与用户信息修改
个人博客站点
CSDN: 猫轻王 https://blog.csdn.net/moer0
个人项目主页https://github.com/moercat
文章目录
前言
运用 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等消息协议最简单的项目能让我们熟悉服务端与客户端的连接也能更好的服务于工作的需要。
阿里云国际版折扣https://www.yundadi.com |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |