Client

设计功能如下:

1、建立与服务器连接

2、请求连接时,加密密码,采用Base64编码

3、定时发送心跳告诉服务器在线(长连接,用于接收推送信息)

4、进行相关的数据处理与交互

第一步:创建一个VCL-Forms Application(创建一个标准VCL程序)

第二步:编写一个公共单元用于与Server通讯,因为客户端一般由多个窗体组成,所以需要一个公共连接类,不能放入窗体,不然窗体关闭,这个连接也会被关闭

以下单元是彩蛋的单元,我简化了,保留部分,用于学习,这个部分主要是向服务器发送请求

unit ClientIocpOper;

interface

uses
Classes,

diocp_coder_tcpClient,//与服务器进行通讯必要单元,当然你用indy来编写客户端就不需要此单元

SimpleMsgPack,//包处理单元

uDIOCPStreamCoder;//编码器与解码器的单元

/// <summary>
/// 请求登录
/// </summary>
/// <param name="AUserID">账号</param>
/// <param name="APaw">密码</param>
procedure CMD_Login(const AUserID, APaw: string);

/// <summary>

/// 初始化客户端使用的对象
/// </summary>
procedure IniClientObject;

/// <summary>
/// 销毁客户端创建的对象
/// </summary>
procedure UnIniClientObject;

var
CurUserID: string;//全局变量
CoderTcpClient: TDiocpCoderTcpClient;//全局通讯client
DiocpContext: TIocpCoderRemoteContext;//全局通讯DiocpContext
implementation

uses SysUtils;

var
CMDObject: TSimpleMsgPack;
CMDStream: TMemoryStream;

procedure SendCMDObject(pvCMDObject: TSimpleMsgPack);
var
lvCMDStream:TMemoryStream;
begin
lvCMDStream := TMemoryStream.Create;
try
pvCMDObject.EncodeToStream(lvCMDStream); // 加密消息
DiocpContext.WriteObject(lvCMDStream);
finally
lvCMDStream.Free;
end;
end;

procedure CMD_Login(const AUserID, APaw: string);
begin
// 连接
CoderTcpClient.open;
if DiocpContext.Active then Exit;
DiocpContext.Connect;
//sfLogger.logMessage('与服务器建立连接成功, 请进行登陆');
// 上线
if DiocpContext.Active then // 连接成功,请求登陆
begin
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);
end;
end;

procedure CMD_KeepAlive;
begin
CMDObject.Clear;
CMDObject.ForcePathObject('cmdIndex').AsInteger := 0;
SendCMDObject(CMDObject);
end;

procedure IniClientObject;
begin
CoderTcpClient := TDiocpCoderTcpClient.Create(nil);

DiocpContext := TIocpCoderRemoteContext(CoderTcpClient.Add);
DiocpContext.RegisterCoderClass(TIOCPStreamDecoder, TIOCPStreamEncoder);

CMDObject := TSimpleMsgPack.Create;
CMDStream := TMemoryStream.Create;
end;

procedure UnIniClientObject;
begin
FreeAndNil(CMDObject);
CoderTcpClient.DisconnectAll;
CoderTcpClient.Free;
CMDStream.Free;
end;

initialization
IniClientObject;

finalization
UnIniClientObject;

end.

第四步:编写接收服务器数据,并更新客户端界面的组件

此部分要,在要建立起与tcpclient接收受数据的关联事件

procedure OnContextActionEx(AObject: TObject);

在窗体creat事件中,

DiocpContext.OnContextAction := OnContextActionEx; // 客户端上下文事件
DiocpContext.OnDisconnectedEvent := OnDisConnected;

然后就可以在OnContextActionEx处理来自服务器的数据,操作界面时注意“创建UI同步临界区对象”,即数据更新界面,防假死

DIOCP之编写第一个应用程序(三)的更多相关文章

  1. DIOCP之编写第一个应用程序(一)

    Server 设计功能如下: 1.支持客户端登录 2.连接数据库进行操作 3.推送信息 4.限制文件上传大小 第一步:创建一个VCL-Forms Application(创建一个标准VCL程序) 第二 ...

  2. DIOCP之编写第一个应用程序(二)

    构建client界面: 构建界面要比写代码更难爱,不是专业UI设计太丑,先有个界面,好写代码,客户端代码与界面设计思想:界面与数据之间分离处理,不能要接收数据的地方写代码,不然以后修改程序会死人的.

  3. Xamarin iOS编写第一个应用程序创建工程

    Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后,就可以在Xamarin Studio中编写程序了.本节将主要讲解在Xamarin Studio中如何进行工程的 ...

  4. 微信小程序-----安装,编写第一个小程序和运行到手机端

    第一步: 微信公众平台注册账号,并选择小程序,网址:mp.weixin.qq.com 填写相关信息,如:主体类型(个人或者企业) AppID  在开发中都是用的到的,服务器域名在网络请求也是用的到的. ...

  5. 在SAP云平台ABAP编程环境上编写第一段ABAP程序

    距2017年秋季的SAP TechEd大会上一位大佬Björn Goerke,SAP's Chief Technology Officer宣布了SAP Cloud Platform即将支持ABAP至今 ...

  6. 编写第一个微信小程序界面

    编写第一个微信小程序界面 不忘初心,方得始终:初心易得,始终难守. 传统的 web 结构 小程序文件目录结构 小程序页面层级结构 编写第一个小程序 1. 创建小程序目录结构 2. 编写代码 welco ...

  7. SharePoint使用BCS开发你第一个应用程序(三)

    SharePoint使用BCS开发你第一个应用程序(三) 创建外部内容类型.         创建外部内容类型有三种不同方式: 1. 在记事本上手写XML代码(不推荐). 2. 使用SharePoin ...

  8. C#基础知识-编写第一个程序(二)

    通过上一篇数据类型已经介绍了C#中最基本的15种预定义数据类型,了解每一种类型代表的数据以及每种类型的取值范围,这是很重要也是最基本.下面我们通过实例来了解每个类型如何去使用.编写C#程序时我们需要用 ...

  9. ASP.NET MVC 5 03 - 安装MVC5并创建第一个应用程序

    不知不觉 又逢年底, 穷的钞票 所剩无几. 朋友圈里 各种装逼, 抹抹眼泪 MVC 继续走起.. 本系列纯属学习笔记,如果哪里有错误或遗漏的地方,希望大家高调指出,当然,我肯定不会低调改正的.(开个小 ...

随机推荐

  1. 修改sys密码与nbu备份脚本密码后,nbu备份报密码无效

    公司要求口令强化,在修改sys密码后nbu的.sh脚本connect备份归档的sys/passwd也随之修改修改后每个业务备份均失败, 每次备份到归档那里就结束报密码无效,疑惑备份脚本密码也同步修改了 ...

  2. 2016年第七届蓝桥杯C/C++程序设计本科B组决赛

    2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream&g ...

  3. 将dataGridView数据转成DataTable

    如已绑定过数据源: DataTable dt = (dataGridView1.DataSource as DataTable) 如未绑定过数据源: public DataTable GetDgvTo ...

  4. vim入门过程

    先下载了一本VIM的用户手册. 看到可以使用vimtutor(VIM的入门教程,很不错,由浅入深)作为入门. Unix系统中,请在命令行输入:vimtutor,进入教程. MS-Windows系统中, ...

  5. Latex感想

    看人家,一个小女生,被导师逼着,首先对电脑方面理解不多,3天时间,latex已经把Paper框架建立起来,我可以说我自愧不如吗?德鲁克<卓有成效的管理者>说的一次干一件事情,<冬吴相 ...

  6. thinkPHP环境搭建小记

    php一直以来都被人诟病,说什么设计得很糟糕,有种你别用啊,不然就别bb了.最近,森哥在去年暑假学习了php基础和mvc模式的基础上准备用尝试一下国产ThinkPHP框架. 1.搭建LAMP环境 我实 ...

  7. Django1.7+JQuery+Ajax集成小例子

    Ajax的出现让Web展现了更新的活力,基本所有的语言,都动态支持Ajax与起服务端进行通信,并在页面实现无刷新动态交互. 下面是散仙使用Django+Jquery+Ajax的方式来模拟实现了一个验证 ...

  8. HTML解析原理

    Web页面运行在各种各样的浏览器当中,浏览器载入.渲染页面的速度直接影响着用户体验 简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程.先来大致了解一下浏览器都 ...

  9. express 快速教程

    阅读 express 官方文档的记录. hello world example var express = require('express') var app = express() app.get ...

  10. Bootstrap文件上传插件File Input的使用

    基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用 Bootstrap文件上传插件File Input是一个不错的文件上传控件, ...