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


前言

运用 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
    标签: go