服务器通过TDiocpCoderTcpServer类进行创建,并设置相应值

一、创建服务

varFTcpServer: TDiocpCoderTcpServer;  //声明全局变量
//创建服务
procedure TfrmServer.FormCreate(Sender: TObject);
beginFUILocker := TIocpLocker.Create('界面异步操作锁');// FOfflineMsgs := TObjectList<TOfflineInfo>.Create;FTcpServer := TDiocpCoderTcpServer.Create(Self);FTcpServer.CreateDataMonitor;  // 创建监视器(如不创建TFMMonitor创建后不能获取监控数据)FTcpServer.WorkerCount := 3;   //设置线程// register decoder and encoder classFTcpServer.RegisterCoderClass(TIOCPStreamDecoder, TIOCPStreamEncoder);  // 注册加解密流类FTcpServer.RegisterContextClass(TMyClientContext);  // 注册客户端Context 绑定接收事件等 自己创建的类(在这里设置好后,客户端地发送请求后,会调用TMyClientContext里面的DoContextAction)//FTcpServer.OnContextDisconnected := OnContextNotifyEvent;// 设置日志记录sfLogger.setAppender(TStringsAppender.Create(mmoMsg.Lines));sfLogger.AppendInMainThread := true;TFMMonitor.CreateAsChild(tsState, FTcpServer);  // 创建服务端运行监控 窗体
end;

二、启用服务

  FTcpServer.Port := 60544;   //设置端口FTcpServer.Active := true;  //启用服务

三、停止服务

  FTcpServer.SafeStop;

四、接收客户端消息

因为在注册服务端的时候通过FTcpServer.RegisterContextClass(TMyClientContext); 注册了类TMyClientContext为客户端通讯类,所以在类下重写DoContextAction 用来接收客户端传过来的数据,并进行处理操作

/// <summary>
/// 处理客户端传来的数据
/// </summary>
procedure TMyClientContext.DoContextAction(const pvObject: TObject);
varlvCMDObj: TSimpleMsgPack;
begin// 此方法已经在 TIOCPCoderClientContext.DoExecuteRequest 中处理了线程同步了lvCMDObj := TSimpleMsgPack.Create;trytryTMemoryStream(pvObject).Position := 0;//通过通讯传值操作将传过来对象转换为数据结构对象lvCMDObj.DecodeFromStream(TMemoryStream(pvObject));  // 解密消息//对消息进行处理操作,如返回此等操作都在这一步进行处理ChatExecute(lvCMDObj);  // 根据消息协议类型由对应的事件处理// 通知客户端本次调用是否成功if lvCMDObj.O['cmdIndex'] <> nil then  // 或 lvCMDObj.ForcePathObject('cmdIndex').AsString <> ''beginif lvCMDObj.O['result.code'] = nil thenlvCMDObj.I['result.code'] := 0;end;excepton E:Exception dobeginlvCMDObj.ForcePathObject('result.code').AsInteger := -1;lvCMDObj.ForcePathObject('result.msg').AsString := e.Message;sfLogger.logMessage('处理逻辑出现异常:'+ e.Message);{$IFDEF CONSOLE}writeln('处理逻辑出现异常:'+ e.Message);{$ENDIF}end;end;//对客户端进行回传if lvCMDObj.O['cmdIndex'] <> nil thenbeginTMemoryStream(pvObject).Clear;lvCMDObj.EncodeToStream(TMemoryStream(pvObject));  // 加密消息TMemoryStream(pvObject).Position := 0;Self.WriteObject(pvObject);  // 添加到SendingQueue回写对象end;finallylvCMDObj.Free;end;
end;

五、给客户端传消息

1》给所有客户端传消息
可以通过Self.Owner.GetOnlineContextList(lvList)函数获得所有会话,进行传递

procedure TMyClientContext.DispatchMsgPackToAll(AMsgPack: TSimpleMsgPack);
varlvMS:TMemoryStream;i:Integer;lvList:TList;lvContext:TIOCPCoderClientContext;
beginlvMS := TMemoryStream.Create;lvList := TList.Create;tryAMsgPack.EncodeToStream(lvMS);lvMS.Position := 0;// 通知所有在线的客户端有人上线或下线等行为Self.Owner.GetOnlineContextList(lvList);for i := 0 to lvList.Count - 1 dobeginlvContext := TIOCPCoderClientContext(lvList[i]);if lvContext <> Self thenbeginlvContext.LockContext('推送信息', nil);trylvContext.WriteObject(lvMS);finallylvContext.UnLockContext('推送信息', nil);end;end;end;finallylvMS.Free;lvList.Free;end;
end;

2>指定客户端传消息
因指定客户但只知道ID编号。需要通过会话查找到此会话号,在进行传递

查找

varvMsgPackTo: TSimpleMsgPack;vFromSession, vToSession: TChatSession;vToSession := TChatSession(ChatSessions.FindSession(vToUserID));
if vToSession <> nil then  // 接收用户在
beginvToContext := vToSession.Context;if vToContext <> nil thenbeginvMsgPackTo := TSimpleMsgPack.Create;tryvMsgPackTo.ForcePathObject('cmdIndex').AsInteger := 6;vMsgPackTo.ForcePathObject('userid').AsString := vFromUserID;vMsgPackTo.ForcePathObject('requestID').AsString :=AMsgPackFrom.ForcePathObject('requestID').AsString;vMsgPackTo.ForcePathObject('msg').AsString :=AMsgPackFrom.ForcePathObject('params.msg').AsString;SendMsgPack(vMsgPackTo, vToContext);finallyvMsgPackTo.Free;end;end;
end;
procedure TMyClientContext.SendMsgPack(AMsgPack: TSimpleMsgPack; pvContext: TObject);
varlvMS:TMemoryStream;
beginlvMS := TMemoryStream.Create;tryAMsgPack.EncodeToStream(lvMS);lvMS.Position := 0;TIOCPCoderClientContext(pvContext).WriteObject(lvMS);finallylvMS.Free;end;
end;

3>在接收时直接回写
因为在接收的时候SELF代表的就是客户端的Context所以直接发送就可以了

      TMemoryStream(pvObject).Clear;lvCMDObj.EncodeToStream(TMemoryStream(pvObject));  // 加密消息TMemoryStream(pvObject).Position := 0;Self.WriteObject(pvObject);  // 添加到SendingQueue回写对象

Diocp学习笔记 3、服务端连接、发送、接收(以实际例子记录)(DELPHI 通讯框架)相关推荐

  1. Linux学习笔记 文件服务Vsftp详细介绍

    Linux学习笔记 文件服务Vsftp详细介绍 知识点: 1.FTP使用TCP连接和TCP端口 2.在进行通信时,FTP需要建立两个TCP连接: 一个用于控制信息,TCP端口号缺省为21 一个用于数据 ...

  2. java学习笔记:里氏代换原则的两个例子

    java学习笔记:里氏代换原则的两个例子 (根据里氏代换原则[能使用父类型的地方一定能使用子类型],抓取 ExampleA类型异常的catch块能够抓住try块中抛出的ExampleB类型的异常) p ...

  3. Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复)

    Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复) 网课传送门:https://www.bilibili.com/video/BV1Sw411Z779?p=168& ...

  4. 开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一]

    开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一] 1. 简介 1.1 结识Lidgren的机缘巧合 开发Unity的各位或多或少都可能在工作中遇到非客户端开发的一些内容.大型 ...

  5. Dubbo -- 系统学习 笔记 -- 示例 -- 服务分组

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 服务分组 当一个接口有多种实现时,可以用group区分. <dubbo:se ...

  6. ElasticSearch学习笔记-ngram、中文拼音、简繁体搜索记录

    ElasticSearch版本:elasticsearch-7.3.0 ElasticSearch相关插件安装可以参考: ElasticSearch学习笔记-插件安装记录_人生偌只如初见的博客-CSD ...

  7. cocos2d-x初探学习笔记(2)--重要概念及Test例子结构

    小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 1.几个重要概念 在cocos2d引擎中,有几 ...

  8. 【深入浅出通信原理-学习笔记】基带信号的发送和接收

    基带信号的发送和接收在通信系统模型中的位置如下图所示 数字信号想要在信道中传输,必须在发射机的基带部分进行脉冲成形,将数字信号转换成脉冲信号,脉冲信号到达接收机后,在基带部分进行采样判决,将数字信号恢 ...

  9. 学习笔记---Web服务、Remoting、WCF (上) --- Web服务

    自从程序设计诞生起, 如何最大限度的重用代码, 减小编码的重复劳动就是程序员永恒不变的课题. 我们从学习面向对象开始, 先后引入了很多种共享代码的手段, 随着学习的不断深入就越发觉得程序设计的发展过程 ...

最新文章

  1. android的支付宝sdk 提示系统繁忙 请稍后再试_《活动运营中防系统扑街指南》
  2. 【数据库复习】第一章绪论
  3. java blockingqueue_Java多线程进阶(三一)—— J.U.C之collections框架:BlockingQueue接口...
  4. 直播实录 | AAAI 2018论文解读:零资源机器翻译的最新进展
  5. DCMTK:DcmOtherLong类的测试程序
  6. 中石油训练赛 - 奎奎画画(思维+并查集+离线处理)
  7. oracle 体系结构及内存管理 15_存储结构
  8. 2018.9.19作业
  9. 2022秋招求职记录(图像 视觉 c++)
  10. 金融直播三大常用场景一文解析
  11. telegram bots 开发者文档 简介
  12. Ragel-基于有限状态机用于产生源码的编译器
  13. 10月业务安全月报 | 美国将奇虎360和知道创宇列入黑名单;丰田泄露30万用户信息;苹果曝严重漏洞
  14. JSON、AJAX、Maven
  15. Declaration of Interest Statement
  16. NLD4J - Arbiter
  17. 一文读懂前端技术演进:盘点Web前端20年的技术变迁史
  18. 简单的excel考勤表
  19. 触摸屏-人机界面页面切换应用教程
  20. 3款国产软件,让你工作效率翻倍,白嫖党的最爱,还不来看

热门文章

  1. 我所见的沈阳世界园艺博览会
  2. 更改iTunes(macOS下)备份路径至移动硬盘
  3. 机器学习(十八)应用实例:照片OCR
  4. 《活出最乐观的自己》
  5. 国庆期间的景区舆情工作实施方案
  6. 用CPU-Z查看内存插槽个数与频率
  7. 2018-1-4 Javascript实例演示:
  8. Windows中更改ctrl与alt键互换位置
  9. 西安80坐标系转经纬度坐标系教程
  10. 前端八股文面试题集合