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

全局统一的消息格式封装类,是客户端与服务端之间传输的唯一消息载体。所有业务消息(如 StandMessageModelBroadcastMessageModel)均序列化为字符串后存入 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,
    }
}
相关推荐
chalmers_152 小时前
基于该 WebSocket 脚本开展专业的压力测试
服务器·websocket·压力测试
小宇的天下2 小时前
Synopsys Skipper 核心功能与使用指南(结构化总结)
运维·服务器
丁丁丁梦涛2 小时前
nginx在多层服务器代理接口地址的应用
运维·服务器·nginx
@淡 定2 小时前
MVCC(多版本并发控制)实现机制详解
java·服务器·数据库
有谁看见我的剑了?2 小时前
ESXI 虚机机硬盘类型和硬盘模式学习
运维·学习·云计算
GISer_CV攻城狮2 小时前
MapLibre/Martin 地图服务器docker化安装部署
运维·服务器·docker
likeshop 好像科技2 小时前
AI知识库架构深度解析:智能体记忆与学习的智慧核心
人工智能·学习·架构
王家视频教程图书馆2 小时前
C#使用 tcp socket控制台程序和unity客户端通信
开发语言·tcp/ip·c#
代码总长两年半2 小时前
Linux---配置编程环境VSCode
linux·运维·服务器