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

数据结构:Socket_Study_Model

Socket_Study_Model 数据结构层,定义了客户端与服务端之间交互的所有消息模型、枚举类型和通用消息格式,基于 JSON 序列化实现跨端数据传输,所有消息均通过统一的 MessageStyle 格式封装。
后期拓展就添加 [XXXXX]Model 然后服务和客户端都可以引用了。

欢迎消息-WelComMessageModel

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

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

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

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

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

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 设置消息类型

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 字段标识业务类型,实现消息的标准化传输。

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

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,
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值