聊天软件的用户消息结构设计

聊天软件的用户消息结构设计

type
  /// <summary>
  /// 消息,
  /// 消息分为:文字、图片、文件。
  /// </summary>
  TMyMSG = record
    IsMSG: Boolean;                          // 是文字消息?
    MSG: string;                             // 文字消息
    IsFile: Boolean;                         // 是文件?
    FileName: string;                        // 文件名
    FileStream: TStream;                     // 文件流
    IsPicture: Boolean;                      // 是图片?
    PictureName: string;                     // 图片名字
    PictureStream: TStream;                  // 图片流
    Time: TDateTime;                         // 时间
    Command: string;                         // 命令字
    SenderId, SenderName: string;            // 发送方
    ReceiverId, ReceiverName: string;        // 接收方
  end;

type
  /// <summary>
  /// 用户消息对象,
  /// 每个用户都有属于自己的消息队列
  /// </summary>
  TUserMsg = record
  private
     FMSGQueue: TQueue<TMyMSG>;
    function GetMsgCount: Integer;
  public
    procedure Create;
    procedure Free;
    procedure EnQueue(AMyMsg: TMyMSG);
    function DeQueue: TMyMSG;
    property MsgCount: Integer read GetMsgCount;
  end;

  FMsgDict: TDictionary<string, TUserMsg>;  // 用户消息字典

procedure TynTcpMethod.RecvMSG;
var
  LUserMsg: TUserMsg;
  LMyMsg: TMyMSG;
begin
  if FMsgDict.TryGetValue(FMsgPack.ForcePathObject('senderid').AsString, LUserMsg) then // 查字典
  begin
    LMyMsg.IsMSG := true;
    LMyMsg.MSG := FMsgPack.ForcePathObject('msg').AsString;
    LMyMsg.IsFile := False;
    LMyMsg.IsPicture := False;
    LMyMsg.Time := FMsgPack.ForcePathObject('time').AsDateTime;
    LMyMsg.Command := FMsgPack.ForcePathObject('command').AsString;
    LMyMsg.SenderId := FMsgPack.ForcePathObject('senderid').AsString;
    LMyMsg.SenderName := FMsgPack.ForcePathObject('sendername').AsString;
    LMyMsg.ReceiverId := FMsgPack.ForcePathObject('receiverid').AsString;
    LUserMsg.EnQueue(LMyMsg);      // 消息入队
  end;
end;

  

posted @ 2018-11-08 15:45  delphi中间件  阅读(577)  评论(0编辑  收藏  举报