Diocp学习笔记 4、客户端连接、发送、接收(DELPHI 通讯框架)

客户端是通过建立 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进行的学习。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值