客户端发送选择角色请求:
procedure TfrmMain.SendSelChr(chrname: string);
begin
m_sCharName := chrname;
SendClientMessage(CM_SELCHR, 0, 0, 0, 0, chrname);
end;
RunGate 转发到 LoginServer:
procedure TLoginSrv.ProcessSelChr(
PlayObject: TPlayObject;
DefMsg: pTDefaultMessage;
sCharName: string
);
begin
// LoginServer 向 DBServer 请求角色数据
if RequestDBHumanInfo(PlayObject.ConnectionID, sCharName) then begin
PlayObject.WaitingDBInfo := True;
end;
end;
LoginServer 请求 DBServer:
function TLoginSrv.RequestDBHumanInfo(nConnID: Integer; sCharName: string): Boolean;
var
DBMsg: TDBMessage;
begin
// 构造请求消息
DBMsg.ident := DB_LOADHUMANRCD;
DBMsg.sCharName := sCharName;
// 发送到 DBServer
SendDBServerMsg(nConnID, @DBMsg);
end;
- 数据返回路径:
DBServer -> LoginServer -> RunGate -> Client
所以确认数据流向是:
Client -> RunGate -> LoginServer -> DBServer -> LoginServer -> RunGate -> Client
LoginServer 在这个过程中起到了中转和处理的作用:
- 接收客户端请求
- 向 DBServer 请求数据
- 处理返回的数据
- 转发给客户端
不是直接与 DBServer 通信,而是通过 LoginServer 中转。这样设计的好处:
- 统一管理数据访问
- 提供额外的安全验证
- 处理数据格式转换
- 实现更好的封装性