不知不觉又是三周过去了。
这几周忙了一下,其他时间全都在搞服务端,简直是酸爽的不行。。。不过还好出了些成果。
目前服务端有:
1、版本服务:游戏版本更新
2、账号服务:用户身份验证,返回各种连接(代理服务、聊天服务)
3、代理服务:获取游服列表、获取游服状态(是否需要排队)、进入游戏的验证、游服数据转发
4、队列服务:处理排队队列中用户的队列情况变化,并广播(本来这个是放在代理服务器上做的,但是我觉得广播起来有点恶心就分出来了,看起来各个服务的功能也清晰些)
5、游戏服务:游戏业务逻辑处理(作为1-n个特殊的客户端连接到代理服务器)
6、聊天服务
客户端方面,优化了一些网络通讯方面的代码,把各种消息重新整理了一遍。界面表现方面几乎没动过。
整个框架基本上实现了登录、选服、排队(等待、结束)、进入游戏、聊天。
想了一下,还是放段代码。
unit gate.handler;
interface
uses
System.SysUtils, System.Classes, System.Math, diocp_coder_tcpServer,
diocp_tcp_server, fol.msgcode, fol.types, fol.simpleMsgPack,
fol.server.types, fol.server.session, gate.session, gate.cache;
procedure pushMsgData(pvMsgData: TSimpleMsgPack; pvContext: TIocpClientContext);
procedure execHeart(pvMsgData: TSimpleMsgPack; pvContext: TIOCPCoderClientContext);
procedure execOffline(pvContext: TIOCPCoderClientContext);
function execRequest(pvMsgData: TSimpleMsgPack; pvContext: TIOCPCoderClientContext): Integer;
function execRegister(pvMsgData: TSimpleMsgPack; pvContext: TIOCPCoderClientContext): Integer;
function execRegisterGameServiceClient(pvMsgData: TSimpleMsgPack; pvContext: TIOCPCoderClientContext): string;
function execRequestServerList(pvMsgData: TSimpleMsgPack): Integer;
function execRequestServerState(const pvServerID: Integer; pvMsgData: TSimpleMsgPack): Integer;
function execRequestStartGame(const pvServerID,pvUserID: Integer;
pvMsgData: TSimpleMsgPack; pvContext: TIOCPCoderClientContext): Integer;
function execRequestGameService(pvMsgData: TSimpleMsgPack): Integer;
function execTranspond(pvMsgData: TSimpleMsgPack; pvContext: TIOCPCoderClientContext): Integer;
implementation
uses utils_safeLogger;
procedure pushMsgData(pvMsgData: TSimpleMsgPack; pvContext: TIocpClientContext);
var
lvStream: TMemoryStream;
begin
lvStream:= TMemoryStream.Create;
try
if Assigned(pvContext) then
begin
pvMsgData.Add('result',MSG_RESULT_Success);
pvMsgData.EncodeToStream(lvStream);
lvStream.Position:= 0;
TIOCPCoderClientContext(pvContext).WriteObject(lvStream);
end;
finally
lvStream.Free;
end;
end;
procedure execHeart(pvMsgData: TSimpleMsgPack; pvContext: TIOCPCoderClientContext);
begin
if pvContext.LockContext('keeplive', nil) then
try
gvSessionManager.validChecked(pvContext);
pvMsgData.Clear;
finally
pvContext.UnLockContext('keeplive', nil);
end;
end;
procedure execOffline(pvContext: TIOCPCoderClientContext);
var
lvServerID: Integer;
lvUserID, lvServerKey: string;
begin
if pvContext.Data <> nil then
begin
{
1. 游戏客户端: 只是连接了代理服务器,并未选服登录游戏 (断开不需要处理)
2. 游戏客户端: 已经进入游戏的,断开需要更新对应服务器freenum
3. OM工具: 断开不需要处理
4. 游戏服务: 断开需要把游服记录删除(或者更新state)
}
lvServerID:= TClientSession(pvContext.Data).ServerID;
lvUserID:= TClientSession(pvContext.Data).SessionID;
case TClientSession(pvContext.Data).ClientType of
tfctGameClient:
begin
sfLogger.logMessage('[INFO]: Client offline, serverid='+inttostr(lvServerID));
if lvServerID = 0 then exit;
//更新freenum(freenum+1)
sfLogger.logMessage('[INFO]: Client offline, userid='+lvUserID);
lvServerKey:= Format('server:%.3d',[lvServerID]);
redisClient.HINCRBY(