c#Socket学习,使用Socket创建一个在线聊天,数据模型(2)

数据结构:Socket_Study_Model

Socket_Study_Model 数据结构层,定义了客户端与服务端之间交互的所有消息模型、枚举类型和通用消息格式,基于 JSON 序列化实现跨端数据传输,所有消息均通过统一的 MessageStyle 格式封装。

后期拓展就添加 [XXXXX]Model 然后服务和客户端都可以引用了。

欢迎消息-WelComMessageModel

服务端向新连接客户端发送的欢迎消息模型,是客户端建立连接后接收的首个消息。

csharp 复制代码
using System;

namespace Socket_Study_Model
{
    /// <summary>
    /// 欢迎消息的model
    /// </summary>
    [Serializable]
    public class WelComMessageModel
    {
        /// <summary>
        /// 欢迎消息
        /// </summary>
        public string Message { get; set; }

        public WelComMessageModel(string message)
        {
            Message = message;
        }
    }
}

StandMessageModel

标准消息模型,用于简单的点对点文本消息、系统提示、操作结果等基础消息,最常用的消息载体。

csharp 复制代码
using System;

namespace Socket_Study_Model
{

    /// <summary>
    /// 标准消息
    /// </summary>
    [Serializable]
    public class StandMessageModel
    {
        public string SenderClientId { get; set; }

        public string TargetClientID { get; set; }

        public string Message { get; set; }

        public string SenderName { get; set; }

        public StandMessageModel(string senderId, string targetId, string message)
        {
            SenderClientId = senderId;
            TargetClientID = targetId;
            Message = message;
        }
    }
}

OnlineUserModel.cs

在线用户相关模型,包含单个在线用户信息和在线列表响应结构,用于响应客户端的在线列表查询请求。

csharp 复制代码
using System.Collections.Generic;
using System;

namespace Socket_Study_Model
{
    /// <summary>
    /// 在线用户信息模型
    /// </summary>
    public class OnlineUserModel
    {
        /// <summary>
        /// 客户端ID
        /// </summary>
        public string ClientId { get; set; }

        /// <summary>
        /// 用户名(未设置则显示"未命名")
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 最后活跃时间
        /// </summary>
        public DateTime LastActiveTime { get; set; }
    }

    /// <summary>
    /// 在线列表响应模型
    /// </summary>
    public class OnlineListResponseModel
    {
        /// <summary>
        /// 在线用户总数
        /// </summary>
        public int TotalCount { get; set; }

        /// <summary>
        /// 在线用户列表
        /// </summary>
        public List<OnlineUserModel> Users { get; set; } = new List<OnlineUserModel>();
    }
}

MessageTypeEnum

消息类型,用于在MessageStyle 设置消息类型

csharp 复制代码
namespace Socket_Study_Model
{
    /// <summary>
    /// 消息类型枚举
    /// </summary>
    public enum MessageTypeEnum
    {
        /// <summary>
        /// 未知类型
        /// </summary>
        Unknown = 0,

        /// <summary>
        /// 欢迎消息
        /// </summary>
        Welcome = 1,

        /// <summary>
        /// 普通文本消息
        /// </summary>
        Text = 2,

        /// <summary>
        /// 广播消息
        /// </summary>
        Broadcast = 3,

        /// <summary>
        /// 心跳消息
        /// </summary>
        Heartbeat = 4,

        /// <summary>
        /// 私信
        /// </summary>
        PrivateMsg = 5,

        /// <summary>
        /// 设置用户名
        /// </summary>
        SetUserName = 6,

        /// <summary>
        /// 请求用户列表
        /// </summary>
        ListRequest = 7,
    }
}

MessageStyle

全局统一的消息格式封装类,是客户端与服务端之间传输的唯一消息载体。所有业务消息(如 StandMessageModel、BroadcastMessageModel)均序列化为字符串后存入 Message 字段,通过 Type 字段标识业务类型,实现消息的标准化传输。

csharp 复制代码
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace Socket_Study_Model
{
    /// <summary>
    /// 消息类型
    /// </summary>
    [System.Serializable]   public class MessageStyle
    {
        /// <summary>
        /// 消息类型
        /// </summary>
        [JsonConverter(typeof(StringEnumConverter))]
        public MessageTypeEnum Type { get; set; }

        /// <summary>
        /// 对应 "clientId"
        /// </summary>
        public string ClientId { get; set; }

        /// <summary>
        /// 消息
        /// </summary>
        public string Message { get; set; }

        public MessageStyle(string clientId, string message, MessageTypeEnum messageTypeEnum = MessageTypeEnum.Text)
        {
            Type = messageTypeEnum;
            ClientId = clientId;
            Message = message;
        }
    }
}

消息广播模型-BroadcastMessageModel

csharp 复制代码
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace Socket_Study_Model
{
    /// <summary>
    /// 广播消息模型
    /// </summary>
    [System.Serializable]
    public class BroadcastMessageModel
    {
        
        /// <summary>
        /// 消息类型
        /// </summary>
        [JsonConverter(typeof(StringEnumConverter))]   public BroadcastMessageType MessageType { get; set; }

        /// <summary>
        /// 消息
        /// </summary>
        public string Message { get; set; }

        /// <summary>
        /// 发送者信息
        /// </summary>
        public string SenderClientId { get; set; }

        /// <summary>
        /// 发送时间
        /// </summary>
        public System.DateTime SendTime { get; set; } = System.DateTime.Now;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="message">消息内容</param>
        /// <param name="senderClientId">发送者id</param>
        /// <param name="messageType">消息类型</param>
        public BroadcastMessageModel(string message,
            string senderClientId,
            BroadcastMessageType messageType = BroadcastMessageType.UserMessage)
        {
            MessageType = messageType;
            Message = message;
            SenderClientId = senderClientId;
        }
    }

    /// <summary>
    /// 广播的消息类型 
    /// </summary>
    public enum BroadcastMessageType
    {
        /// <summary>
        /// 用户消息
        /// </summary>
        UserMessage = 0,

        /// <summary>
        /// 警告消息
        /// </summary>
        Warning = 1,

        /// <summary>
        /// 错误消息
        /// </summary>
        Error = 2,

        /// <summary>
        /// 状态更新
        /// </summary>
        StatusUpdate = 3,
    }
}
相关推荐
gjf05_053 小时前
人该怎样活着呢?版本75.8
学习
拂拉氏4 小时前
【知识讲解】 Linux之动静态库的了解
linux·运维·服务器·动静态库
Fcy6484 小时前
Linux下 五种IO模型的认识与⾮阻塞IO的实现
linux·服务器·io
li星野4 小时前
【学习记录】PCB与PCBA核心知识全解析:从设计到制造的关键细节
学习·制造
卿卿的产品经理日记5 小时前
【AI产品经理实战】Day 35|从“沉迷工具“到回归 AI 底层:Skill 收官、系统复盘与下一个 13 天
人工智能·学习·产品经理
一条泥憨鱼6 小时前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
天国梦6 小时前
国密门禁品牌怎么选?2026年最新3个避坑要点
运维·服务器·数据库·python
HY小宝F6 小时前
树莓派智能摄像头系统 30 天重学计划之 Day 04 · HTTP / API:控制链入口 —— 学习总结
网络协议·学习·http
夜之眷属7 小时前
PriorityQueue:for-each 遍历和 poll 取出,顺序一样吗?
java·服务器·数据结构·后端·算法
龙仔7257 小时前
RustDesk 自建服务器 Key 强校验配置笔记
运维·服务器·笔记