DIOCP之编写第一个应用程序(三)
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之编写第一个应用程序(三)的更多相关文章
- DIOCP之编写第一个应用程序(一)
Server 设计功能如下: 1.支持客户端登录 2.连接数据库进行操作 3.推送信息 4.限制文件上传大小 第一步:创建一个VCL-Forms Application(创建一个标准VCL程序) 第二 ...
- DIOCP之编写第一个应用程序(二)
构建client界面: 构建界面要比写代码更难爱,不是专业UI设计太丑,先有个界面,好写代码,客户端代码与界面设计思想:界面与数据之间分离处理,不能要接收数据的地方写代码,不然以后修改程序会死人的.
- Xamarin iOS编写第一个应用程序创建工程
Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后,就可以在Xamarin Studio中编写程序了.本节将主要讲解在Xamarin Studio中如何进行工程的 ...
- 微信小程序-----安装,编写第一个小程序和运行到手机端
第一步: 微信公众平台注册账号,并选择小程序,网址:mp.weixin.qq.com 填写相关信息,如:主体类型(个人或者企业) AppID 在开发中都是用的到的,服务器域名在网络请求也是用的到的. ...
- 在SAP云平台ABAP编程环境上编写第一段ABAP程序
距2017年秋季的SAP TechEd大会上一位大佬Björn Goerke,SAP's Chief Technology Officer宣布了SAP Cloud Platform即将支持ABAP至今 ...
- 编写第一个微信小程序界面
编写第一个微信小程序界面 不忘初心,方得始终:初心易得,始终难守. 传统的 web 结构 小程序文件目录结构 小程序页面层级结构 编写第一个小程序 1. 创建小程序目录结构 2. 编写代码 welco ...
- SharePoint使用BCS开发你第一个应用程序(三)
SharePoint使用BCS开发你第一个应用程序(三) 创建外部内容类型. 创建外部内容类型有三种不同方式: 1. 在记事本上手写XML代码(不推荐). 2. 使用SharePoin ...
- C#基础知识-编写第一个程序(二)
通过上一篇数据类型已经介绍了C#中最基本的15种预定义数据类型,了解每一种类型代表的数据以及每种类型的取值范围,这是很重要也是最基本.下面我们通过实例来了解每个类型如何去使用.编写C#程序时我们需要用 ...
- ASP.NET MVC 5 03 - 安装MVC5并创建第一个应用程序
不知不觉 又逢年底, 穷的钞票 所剩无几. 朋友圈里 各种装逼, 抹抹眼泪 MVC 继续走起.. 本系列纯属学习笔记,如果哪里有错误或遗漏的地方,希望大家高调指出,当然,我肯定不会低调改正的.(开个小 ...
随机推荐
- 利用swap技巧去除容器多余的容量
假设我们预先为容器添加了一部分元素,接着用clear将它们删除,容器内部分配的存储空间实际上不会减小,改变的只是能够访问的元素个数.如下所示: std::vector<int> vec; ...
- Mybatis获取插入记录的自增长ID(转)
1.在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名,而不是表格的字段名. <ins ...
- C#:String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}等等
int a = 12345678; //格式为sring输出// Label1.Text = string.Format("asdfadsf{0}adsfasdf",a); / ...
- ZYNQ学习之二-EMIO
---恢复内容开始--- 本次试验学习和掌握zynq的emio的使用,是通过PS控制PL端的GPIO. 1.创建硬件工程,主要就是添加EMIO就可以.当然了创建工程的时候还要注意DDR的设置,根据自己 ...
- Proe Top-Down设计演示
前段时间有网友问我,proe 里面有没有装配设计中当某一零件尺寸需要修改时, 与其相关的零件尺寸都需要随之做相应改变的法子.我认为top-down是很好的选择. 下面介绍一下top-down的理论: ...
- 在windows编译MariaDB
OS: Windows XP sp3 IDE: VS2010 MariaDB: V5.5 (到目前为止2016.5,中文域(.cn)只有清华大学 TUNA 镜像源可用) (.tar.gz为源码:.zi ...
- ubuntu-利用pdnsd-TCP方式获取IP-拒绝DNS污染
那,自从国内技术出现了DNS污染问题呢,时常导致很多国外网站访问不正常,所以通过参考一些博客所属避免DNS污染的方法,决定搭建一个Ubuntu JeOS下的DNS缓存服务器,该服务器利用TCP方式获取 ...
- 嵌套 QQ、微博 通讯工具到HTML中
自己QQ.微博的实例: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defa ...
- java.lang.NoClassDefFoundError: org/apache/ibatis/session/SqlSession
在配置一个springmvc+mybatis的项目时,总是有报一个错误: org.springframework.beans.factory.BeanCreationException: Error ...
- opencv基于混合高斯模型的图像分割
#include "stdafx.h" #include <opencv\cv.h> #include <opencv\highgui.h> #includ ...