您现在的位置是:首页 >其他 >Golang 从零开始实现多人聊天室(五)开发前奏-目录结构优化网站首页其他

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

猫轻王 2024-07-23 00:01:02
简介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 
", 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等消息协议最简单的项目,能让我们熟悉服务端与客户端的连接,也能更好的服务于工作的需要。

希望这个博客能对你有所益处。我是轻王,我为自己代言。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。