diocp之编写第一个应用程序

author author     2022-08-04     457

关键词:

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之编写第一个应用程序

Client设计功能如下:  1、建立与服务器连接  2、请求连接时,加密密码,采用Base64编码  3、时时发送心跳告诉服务器在线  4、进行相关的数据处理与交互第一步:创建一个VCL-FormsApplication(创建一个... 查看详情

diocp之demo学习顺序及达到要求

第一个:ECHO,了解基础网络通讯过程也触发事件第二个:StringDEMO,理解长字符串发送编码过程第三个:StreamCoderDEMO,理解粘包的理方式,即数据类型+数据长度+数据流第四个:diocp_utils_demo,理解字符处理函数,快速编程处理字... 查看详情

diocp之demo-粘包问题及解决

...可是由于client一次只收到10240个A,余下的又发送一次:第一个包中包括有此数据包的总长度,读取出长度,然后接收一个对比长度,如果当前长度<包标定长度,那么就等余下包,一直等到足够包长度,把他们组合在一起就算接收一个... 查看详情

diocp之开发流程图之client

...发不同本地开发,首先你应该知道完整的开发流程即网络程序运行的先后顺序,有个整体感知,不能一头深入到代码中,框架明白之后再去研究具体实现,大家可以用思维导图来画画,试着写个DEMO,你会发现很多,大神们多多... 查看详情

diocp之demo-登陆验证设计

ECHOServer代码(不考虑粘包的处理):unitufrmMain;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ActnList,diocp_tcp_server,ExtCtrls,ComCtrls,utils_safeLogger,utils_ 查看详情

diocp之获取在线用户列表

通过获取tcpserver.getonlinecontextlist来得到在线列表procedureTfrmMain.btn_refreshClick(Sender:TObject);varlvList:TList;i:Integer;lvClient:TMyClientContext;lvItem:TListItem;beginlstClientINfo.Items.Clear;lvList:= 查看详情

diocp之数据接收事件

一、不引用编码器与解码器的情况下(ECHO的DEMO)  类TIOCPtcpclient,接收服务器的数据事件:OnRecvBuffer  类TDiocpTcpServer,接收客户端数据事件:OnRecvBuffer  TIocpTcpServer  propertyOnDataReceived:TOnDataRec 查看详情

tornado之运行第一个tornado程序

Tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。首先是安装tornado. tornado不支持windows。如果... 查看详情

diocp之demo-登陆验证设计

登陆设计原理:(一)client在与服务器建立连接后向服务器发送含有"USER=XXXXX&PWD=XXXXX"或者用JSON字符串。   client的代码需要写在OnContextConnected事件中,注{"cmd":"login","User":"admin","Pwd":"admin888"}(二)服务器收到客户端传来的... 查看详情

初识c++之helloworld!(代码片段)

...3;基础入门1.第一个C++程序1.1创建项目1.2创建文件1.3编写代码1.4运行程序2.注释3.变量4.常量5.关键字6.标识符命名规则1.第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1创建项... 查看详情

初识c++之helloworld!(代码片段)

...08;一)1.第一个C++程序1.1创建项目1.2创建文件1.3编写代码1.4运行程序2.注释3.变量4.常量5.关键字6.标识符命名规则1.第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1创建项... 查看详情

pyhton编程之第一个pyhton程序

...的Python均为3。  1、Windows操作系统:  使用Pyhton语言编写的第一个程序:#!/usr/bin/envpython#*-*coding:utf-8*-*#输出“你好,世界”print("Hel 查看详情

qt软件开发之入门基础--1.5开发第一个qt程序

1.5开发第一个QT程序在QT开发过程中,可以手动编写代码也可以使用UI设计师直接拖拽控件的方式编写界面和布局,在实际的开发过程中一般是两种方式结合使用,提高开发效率。1.5.1新建HelloQt工程本小节用一个简单的"HelloQT"程序... 查看详情

编写第一个裸机程序(代码片段)

一.ARM裸机之Makefile  1.1.Makefile分析led.bin:led.oarm-linux-ld-Ttext0x0-oled.elf$^arm-linux-objcopy-Obinaryled.elfled.binarm-linux-objdump-Dled.elf>led_elf.disgccmkv210_image.c-omkx210./mkx210led.bin210 查看详情

小甲鱼零基础汇编语言学习笔记第四章之第一个汇编程序

1、使用工具   代码编写:NotePad++,代码编译器:MASM 2、一个源程序从写出到执行的过程   第一步,使用文本编辑器,用汇编语言编写汇编源程序,这一步产生一个存储源程序的文本文件。   ... 查看详情

c语言试题189之编写一个程序,按照下图中的样子创建数据结构,最后三个对象都是动态分配的结构。第一个对象则可能是一个静态的指向结构的指针

查看详情

c语言试题189之编写一个程序,按照下图中的样子创建数据结构,最后三个对象都是动态分配的结构。第一个对象则可能是一个静态的指向结构的指针

查看详情

c语言试题189之编写一个程序,按照下图中的样子创建数据结构,最后三个对象都是动态分配的结构。第一个对象则可能是一个静态的指向结构的指针

查看详情