Golang 从零开始实现多人聊天室(五)开发前奏-目录结构优化

系列文章目录

跟着😽猫猫学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)
newLogin(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等消息协议最简单的项目,能让我们熟悉服务端与客户端的连接,也能更好的服务于工作的需要。

希望这个博客能对你有所益处。我是轻王,我为自己代言。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫轻王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值