客户端是通过建立 TIocpCoderRemoteContext 类对服务器进行连接操作,传输的值。以通讯传值类进行传递
1、创建连接
在全局变量处创建
var
DiocpContext: TIocpCoderRemoteContext;
2、启动连接
DiocpContext.Host := '192.168.127.130';
DiocpContext.Port := 60544;
DiocpContext.OnContextAction := OnContextActionEx; //注册接收事件 服务端在发送到客户端事。处罚此事件
DiocpContext.OnDisconnectedEvent := OnDisConnected; //注册客户端断开事件 与服务端断开后执行
CoderTcpClient.open;
if DiocpContext.Active then Exit;
DiocpContext.Connect;
if DiocpContext.Active then // 连接成功,请求登陆
begin
//进行与服务器操作
end;
3、往服务器发送消息
1>生成传递数据
CMDObject.Clear;
CMDObject.ForcePathObject('cmdIndex').AsInteger := 11;
CMDObject.ForcePathObject('requestID').AsString := 'login';
CMDObject.ForcePathObject('user.id').AsString := AUserID;
CMDObject.ForcePathObject('user.paw').AsString := APaw;
SendCMDObject(CMDObject);//调用发送参数
2>发送数据
procedure SendCMDObject(pvCMDObject: TSimpleMsgPack);
var
lvCMDStream:TMemoryStream;
begin
lvCMDStream := TMemoryStream.Create;
try
pvCMDObject.EncodeToStream(lvCMDStream); // 加密消息
DiocpContext.WriteObject(lvCMDStream); //DiocpContext是之前启用的连接
finally
lvCMDStream.Free;
end;
end;
4>接收服务端传递的数据
procedure TMessageCenterForm.OnContextActionEx(AObject: TObject);
var
lvStream:TMemoryStream;
lvCMDObject: TSimpleMsgPack;
lvItem, lvList:TSimpleMsgPack;
begin
lvStream := TMemoryStream(AObject);
lvCMDObject:= TSimpleMsgPack.Create;
try
lvCMDObject.DecodeFromStream(lvStream);
// 异常信息
if lvCMDObject.ForcePathObject('result.code').AsInteger = -1 then
sfLogger.logMessage(lvCMDObject.ForcePathObject('result.msg').AsString);
if lvCMDObject.ForcePathObject('cmdIndex').AsInteger = 6 then // 消息是发送人对所有人发送(公告)
CharFrom.RzRichEdit1.Lines.add(Format('[%s]:%s', [lvCMDObject.ForcePathObject('userid').AsString,
lvCMDObject.ForcePathObject('msg').AsString]))
{
if lvCMDObject.ForcePathObject('requestID').AsString = 'login' then // 登录请求的返回数据
begin
CMD_UpdataUsers(CurUserID);
if lvCMDObject.ForcePathObject('result.code').AsInteger = 0 then // 发出的请求服务端执行成功
begin
sfLogger.logMessage('登录成功...');
IocpTaskManager.PostATask(KeepAliveEx, True);
end;
end
else
if lvCMDObject.ForcePathObject('cmdIndex').AsInteger = 21 then // 服务端有人上线的通知
begin
CMD_UpdataUsers(CurUserID);
if lvCMDObject.ForcePathObject('type').AsInteger = 0 then
sfLogger.logMessage(Format('[%s]下线!', [lvCMDObject.ForcePathObject('userid').AsString]))
else
sfLogger.logMessage(Format('[%s]上线!', [lvCMDObject.ForcePathObject('userid').AsString]));
end
else
if lvCMDObject.ForcePathObject('cmdIndex').AsInteger = 6 then // 消息是发送人对所有人发送(公告)
sfLogger.logMessage(Format('[%s]:%s', [lvCMDObject.ForcePathObject('userid').AsString,
lvCMDObject.ForcePathObject('msg').AsString]))
else
if lvCMDObject.ForcePathObject('cmdIndex').AsInteger = 5 then // 有人发送私聊信息
begin
if lvCMDObject.ForcePathObject('result.code').AsInteger = 0 then
begin
sfLogger.logMessage(Format('%s', [lvCMDObject.ForcePathObject('params.msg').AsString]));
end;
end
else
if lvCMDObject.ForcePathObject('cmdIndex').AsInteger = 7 then // 从服务端获取到离线期间积累的消息
begin
if lvCMDObject.ForcePathObject('result.code').AsInteger = 0 then
SetOfflineMsg(lvCMDObject);
end
else
if lvCMDObject.ForcePathObject('cmdIndex').AsInteger = 3 then // 返回所有用户列表信息
begin
if lvCMDObject.ForcePathObject('result.code').AsInteger = 0 then
RefreshUserList(lvCMDObject);
end; }
finally
lvCMDObject.Free;
end;
end;
procedure TMessageCenterForm.OnDisConnected(AContext: TDiocpCustomContext);
begin
//ShowMessage('服务端关闭,请重新登录!');
end;
使用的是通讯框架下面地址
https://download.csdn.net/download/z123191456/11021119
里面的diocp-v5-master\samples\ChatDEMO By 彩蛋 DEMO进行的学习。