会话管理是指客户端连接服务端后建立的会话,在后面服务端对客户端进行操作时通过会话找到相应客户端进行消息的发送,下线的处理(客户端因只对服务端。所以无会话机制只有一个连接)
介绍:
会话调用的是TSessionItem 类 ,并在此基础上增加相应功能,在程序事例里创建的TChatSession类的会话,并在里面增加了对应的连接、消息内容(可以看通讯传值),创建销毁等操作
Self 是当前正在操作的会话
增加记录会话
var
ChatSessions: TSessions;
一、新建会话
var
lvSession: TChatSession;
begin
vSession := TChatSession(ChatSessions.CheckSession(lvUserID)); // 查找会话,如果没有则创建
lvSession.Context := Self; //对应客户端的一个连接
lvSession.UserID := lvUserID;
lvSession.State := 1; // 在线
Self.Data := lvSession; // 建立关联关系
end;
二、查找会话
1>判断会话
if ChatSessions.FindSession(lvUserID) <> nil then
begin
raise Exception.Create('用户已经登陆!');
end;
接收到消息时,判断会话是否存在(除着次登陆其它都需要判断)
lvSession := TChatSession(Self.Data);
if lvSession = nil then
begin
raise Exception.Create('未登陆用户!');
end;
2》取会话相应的值
说明:在创建会话时,会将客户端相应的信息存储到此会话内,在接收到客户端信息后通过SELF.DATE 取到之前存的会话信息,并调用相应的值进行处理
var
vFromSession, vToSession: TChatSession;
begin
vFromSession := TChatSession(Self.Data); // 得到当前Context对应的会话
if vFromSession = nil then
raise Exception.Create('用户未登陆!');
vFromUserID := vFromSession.UserID; // 请求ID
end;
3>通过键查到指定的会话,并取到客户端IP
vSession := TChatSession(ChatSessions.FindSession(lvUser.Items[i].Caption));
if vSession <> nil then
begin
vSession.Context.RemoteAddr
end;
实例:判断用户是否在线
// 根据当前在线用户,修改用户控件上各用户的在线状态
for i := 0 to lvUser.Items.Count - 1 do
begin
vSession := TChatSession(ChatSessions.FindSession(lvUser.Items[i].Caption));
if vSession <> nil then
begin
if vSession.State = 1 then // 在线
begin
lvUser.Items[i].SubItems[1] := vSession.Context.RemoteAddr + ':'
+ IntToStr(vSession.Context.RemotePort);
lvUser.Items[i].SubItems[2] := '在线';
Inc(vInLineCount);
end
else
begin
lvUser.Items[i].SubItems[1] := '';
lvUser.Items[i].SubItems[2] := '离线';
end;
end
else
begin
lvUser.Items[i].SubItems[1] := '';
lvUser.Items[i].SubItems[2] := '离线';
end;
end;
使用的是通讯框架下面地址
https://download.csdn.net/download/z123191456/11021119
里面的diocp-v5-master\samples\ChatDEMO By 彩蛋 DEMO进行的学习。