今天展示一下如何使用这里描写的库实现一个简单的聊天工具。Callback Interface是昨晚才加的,但是还有一些features没实现,等做完了再做一个Demo,然后提供源代码。

使用这个库开发网络程序的步骤如下

1:将需要提供给客户端调用的功能封装成类,实现在服务器端,然后注册需要的类、类成员变量和类成员函数。

2:服务器创建VL_ObjectServer,并将注册的类提供给它,然后运行。

3:打开http://localhost:PORT/SERVER/index.htm下载服务器端需要的CallbackProxy类。当类需要客户端提供Callback的时候,就可以用CallbackProxy来调用它。这里CallbackProxy是自动生成的。

4:创建客户端工程,在上面那个网址下载生成的服务器端的类的Proxy.这个Proxy负责连接服务器并把所需要的数据序列化之后发送过去。服务器端的VL_ObjectServer负责解读序列化的内容,然后调用客户端实现的那些服务类。

5:写一个UI调用下载的服务类的Proxy. 6:运行它们。

实际上就是把他们当成同一个程序来写,然后这个库提供了很多方便的功能让客户端可以直接调用服务器端写的类,中间的链接和传输不需要自己处理,完全是自动的。

首先我们定义这个聊天工具的接口。聊天工具登录的时候服务器会自动分配一个名称,用户可以随后更改。然后剩下的只有两个操作:发送信息和退出登录。我们默认程序关闭的时候退出登录。于是可以先做一个User类,然后做一个Service类,Service调用Callback来告诉其他用户某人发送了信息

1 class RoaTalkUser : public VL_Base

2 {

3 public:

4   typedef VL_AutoPtr          Ptr;

5   typedef VL_List    List;

6   typedef VL_ListedMap    StringMap;

7

8   VUnicodeString          Name;

9   RoaTalkService*          Owner;

10 };

11

12 class RoaTalkCallback : public VL_ObjectCallback

13 {

14 public:

15   virtual void          Say(RoaTalkUser::Ptr User , VUnicodeString Message);

16   virtual void          Login(RoaTalkUser::Ptr User);

17   virtual void          Logout(RoaTalkUser::Ptr User);

18   virtual void          Rename(VUnicodeString OldName , RoaTalkUser::Ptr User);

19 };

20

21 class RoaTalkService : public VL_ObjectService

22 {

23 protected:

24   VUnicodeString          FName;

25   RoaTalkCallback*        FCallback;

26

27   void             Initialize();

28 public:

29   typedef VL_List      List;

30

31   RoaTalkService();

32   ~RoaTalkService();

33

34   RoaTalkCallback*        GetCallback();

35

36   VUnicodeString          GetCurrentName();

37   VBool             SetCurrentName(VUnicodeString Name);

38   void             Say(VUnicodeString Message);

39   VL_AutoPtr<:list>  GetUsers();

40 };

这只是给客户端调用的外壳。因为每一个客户端连接的时候,系统就会创建一个RoaTalkService类,所以还需要一个全局变量来记录所有的Service类(未来可能会提供Feature来避免这种全局变量的产生)。这个全局的服务类是需要锁的

1 class RoaTalkServer : public VL_Base

2 {

3 protected:

4   RoaTalkUser::StringMap      FUsers;

5   VL_SynCriticalSection      FServerLock;

6 public:

7   RoaTalkServer();

8   ~RoaTalkServer();

9

10   VBool             CreateUser(VUnicodeString Name , RoaTalkService* Service);

11   VBool             DestroyUser(VUnicodeString Name);

12   VBool             RenameUser(VUnicodeString OldName , VUnicodeString NewName);

13   VL_AutoPtr<:list>  GetUsers();

14   VBool             Say(VUnicodeString Name , VUnicodeString Message);

15 };

16

17 extern void             CreateRoaTalkServer();

18 extern void             DestroyRoaTalkServer();

19 extern RoaTalkServer*        GetRoaTalkServer();

实现他们是很容易的。Service通过调用CreateUser、DestroyUser、RenameUser和Say来完成SetCurrentName和Say两个操作。Server(注意不是Service)在被调用的时候,通过向其他Service->GetCallback()来通知其他客户端某个人做了什么事情。注意虽然代码是在服务器端,但是RoaTalkCallback的实现是在客户端。下面会告诉大家如何把两边连接起来的的。现在的事情就是要先把他们实现好,我们注意到Service有一个Initialize函数,这个函数通过创建一个生成的RoaTalkCallbackProxy类然后赋值给FCallback变量,从而达到让Server获得那么多Callback的目的。但是现在服务器还没启动,因此先留空。FCallback设置成NULL.等到代码写完了之后(见下文),我们需要注册它

C语言 游戏远程call调用,C++远程调用类操作支持CallbackInterface(1)相关推荐

  1. Hprose 是轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件

    High Performance Remote Object Service Engine: 一个MIT开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件 hprose 是一个新的远 ...

  2. java调用远程 接口_java通过url调用远程接口返回json数据

    java通过url调用远程接口返回json数据,有用户名和密码验证, 转自 https://blog.csdn.net/wanglong1990421/article/details/78815856 ...

  3. php调用rpc,远程调用RPC

    [TOC] # 远程调用 RPC(Remote procedure Call) > using php-amqplib 在第二节教程中,我们知道了怎样使用工作队列将耗时的任务分发给多个消费者. ...

  4. Delphi 调用Windows 远程桌面核心代码

    通过COM接口调用远程桌面,将远程桌面显示在应用程序窗体内: 一.主程序: unit uMain;interfaceusesWinapi.Windows, Winapi.Messages, Syste ...

  5. WinAPI【远程注入】利用远程线程注入DLLDelphi版

    { WinAPI[远程注入]利用远程线程注入DLLDelphi版} (okwary) 小叹的学习园地 ( SDK文档里是这样描述的:进程是一个正在运行的程序,它拥有自己的地址空间,拥有自己的 ...

  6. 远程桌面大师android,远程桌面大师iPad版

    远程桌面大师iPad版是从iPhone.iPad.iPod访问电脑系统最方便的App.用户可以通过远程桌面大师iPad版在本地网络查看和编辑Word.Excel.PPT文档和PDF文档,用浏览器来浏览 ...

  7. go get 不了,就使用 go.mod中的replace来引入远程包(需要把远程包下载在本地)

    目录 大概就是: 说一下我的案例 下面开始引入主题:如果利用replace替换包 先解释下go mod 的 replace 关键字是怎么使用的 为什么需要 replace? replace怎么用? 参 ...

  8. 服务器自动关闭远程打印服务,关于远程桌面“打印重定向”问题解决方案

    通过远程桌面,调用本地打印机资源,一般存在2个问题,第一个问题 驱动问题,比如64位系统和32位系统,这就存在一个打印机驱动安装兼容性问题了,没法2者兼顾 第二个问题 重定向不成功,也就是不能在远程桌 ...

  9. easyx游戏编程:五子棋(C语言游戏开发)

    easyx游戏编程:五子棋(C语言游戏开发) 五子棋: 本游戏用到了图形界面库graphics.h,图形界面库下载安装: 下载链接: https://easyx.cn/downloads/. 下方有源 ...

最新文章

  1. 分布式服务框架原理与实践pdf_深度解析微服务治理的技术演进和架构实践
  2. android 关闭多点触控_Cocos Creator关闭多点触摸的问题
  3. 面向对象——多态,抽象类,接口(二)
  4. 使用双亲指针表示法存储一棵树,可以方便解决下列哪个应用问题( )
  5. ArcGIS实验教程——实验三十八:基于ArcGIS的等高线、山体阴影、山顶点提取案例教程
  6. 失眠患者应该边工作边调理,还是辞职回家调理?
  7. 计算机运算器存储器知识点,计算机一级知识点:运算器、控制器
  8. bzoj 1054: [HAOI2008]移动玩具.cpp
  9. sqlserver存储过程学习
  10. Linux服务器安装宝塔面板,Linux服务器安装宝塔服务器管理控制面板
  11. 棒棒的毛笔字PS教程
  12. 操作系统 信号量机制
  13. hackthissite 闯关日记
  14. 小牛电动车能跑多快、多远?一起来了解一下
  15. Gartner 魔力四象限 -- 应用安全检测
  16. wandb 导入环境变量问题
  17. kali为一加三(oneplus3)编译lineage15.1(安卓8.1)
  18. 戴尔游匣G15怎么样?真实体验不翻车
  19. Hyperlegder Fabric监控:blockchain-explorer
  20. 监控摄像头的电源线安装方案

热门文章

  1. 百个JavaScript函数以及基础写法汇总
  2. 一起学Windows phone 7开发(四. DeepZoom)
  3. 2009年总结-爱与快乐着
  4. 程序员面试被问:公司遇难你愿意留下?网友:辉煌时升职吗
  5. Java Comparator排序
  6. WPF中的依赖项属性
  7. SQL取xml中节点值
  8. 初心大陆-----python宝典之以外学习对比去重
  9. python基础学习笔记(八)
  10. 抓包分析TCP的三次握手和四次分手