聊天软件的用户消息结构设计
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;