(中行雷威2018.3.10)

(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943 、860634510、299497712 ,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群)

【阅读倡议】

1、有问题请留言;

2、没问题请点赞;

3、看连载请加群;

4、下源码请加群;

【开发工具】

1、C++Builder10.2.2tokyo

2、FMSoft_uniGUI_Complete_Professional_1.0.0.1424_Trial

本人主笔的国内第一本uniGUI教学资料已诞生,分为cbuilder和delphi两个版本,买代码送手册,需要的朋友可以加入我的QQ技术交流群484979943、860634510、299497712给我(群主)留言。资料简介: https://blog.csdn.net/dlboy2018/article/details/88923832

本文将简单介绍如何在uniGUI下使用indy通讯控件IdTCPClient开发一个WEB通讯应用,通过该应用向远程服务器发送和接受报文。通讯方式为同步短连接,即有发送需求就建立连接,连接上就发送,发送完就关闭。

一、创建项目

主菜单File-》New-》Other选择uniGUI for C++Builder创建项目

选择Yes.完成项目创建。

主菜单:设置Project-》Options设置Include path和Library path,分别都添加C:\Program Files (x86)\Embarcadero\Studio\19.0\uniGUI目录

Linker和Runtime Packages取消动态链接和引用动态包

二、主窗口设计

在主窗口MainForm上摆放两个UniEdit控件,一个设置远程服务器地址,一个设置远程服务器端口;摆放两个UniMemo控件,一个用于配置发送出去的报文,一个用于显示接收到的报文;摆放三个UniBitBtn控件,一个用于连接远程服务器,一个用于发送报文,一个用于断开通讯;摆放一个IdTCPClient控件用于通讯;摆放一个UniTimer控件,用于监测远程服务器的返回报文。

三、代码设计

1、UniBitBtn1按钮添加OnClick事件实现连接远程服务器

void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
//连接
IdTCPClient1->Host=UniEdit1->Text;
IdTCPClient1->Port=UniEdit2->Text.ToInt();
if(!IdTCPClient1->Connected())
{
try
{
IdTCPClient1->Connect();
}
catch(...)
{
ShowMessage("连接失败!");
}
}
else
{
ShowMessage("已经连接成功!");
}

同时,在IdTCPClient的OnConnect事件和OnDisconnect事件中添加代码,显示连接和断开结果。

void __fastcall TMainForm::IdTCPClient1 Connected (TObject *Sender)
{
ShowMessage("连接成功!");

void __fastcall TMainForm::IdTCPClient1 Disconnected (TObject *Sender)
{
ShowMessage("断开成功!");
}

2、UniBitBtn3按钮添加OnClick事件实现断开与远程服务器的连接

void __fastcall TMainForm::UniBitBtn3Click(TObject *Sender)
{
//断开
IdTCPClient1->Disconnect();

3、UniBitBtn2按钮添加OnClick事件实现向远程服务器发送报文
void __fastcall TMainForm::UniBitBtn2Click(TObject *Sender)
{
UniBitBtn1->Click();//发送报文前先调用连接按钮事件确保已经连接再发送

AnsiString sendMsg;
TByteDynArray sendArray;
char sendBuf[1024];
sendMsg=UniMemo1->Text;
memset(sendBuf,'\0',1024);
sprintf(sendBuf,"%s",sendMsg);
sendBuf[sendMsg.Length()]='\n';
sendArray=Uidglobal::RawToBytes(static_cast<void*>(sendBuf),sendMsg.Length());
if(!IdTCPClient1->Connected())
{
return;
}
IdTCPClient1->Socket->Write(sendArray,sendMsg.Length(),0);//发送报文


}

4、UniTimer1的OnTimer事件配置接收报文代码

void __fastcall TMainForm::UniTimer1Timer(TObject *Sender)
{
AnsiString recvMsg;
TByteDynArray recvArray;
char recvBuf[1024];
Uidglobal::TIdBytes recvBytes; /*该变量不知道为啥不能放到程序头部定义,在这个函数里定义却没有问题*/
if(!IdTCPClient1->Connected())
return;
if(IdTCPClient1->Socket->InputBuffer->Size>0)//判断输入缓冲区是否有内容要接收
{
IdTCPClient1->Socket->ReadBytes(recvBytes,IdTCPClient1->Socket->InputBuffer->Size,true);//接收报文
recvMsg=StringOf(recvBytes);
memset(recvBuf,'\0',1024);
for(int m=0;m<recvMsg.Length();m++)//此段为接收到报文的格式化,一般能正常显示的GBK报文接收用不到,但是如果返回无法显示的特殊计算机代码则可能导致接收报文显示时候断开,此时需要配置。
{
sprintf(&recvBuf[m],recvMsg.SubString(m+1,1).c_str(),1);
if((int)recvBuf[m]>=0 && (int)recvBuf[m]<=31) //为正常显示,将导致字符串中断的字符‘ascii=0’替换为‘.’
{
recvMsg[m+1]='.';
}
}
//格式化显示
UniMemo2->Lines->Add(recvMsg);

UniBitBtn3->Click();//接收完就调用断开按钮断开与服务器的连接。
}
}

四、运行效果

在浏览器中输入http://127.0.0.1:8077打开项目主界面,本例中我启动了一个我开发的交易测试模拟器作为服务端,运行结果如下:

1、本例新开发的客户端

2、配合测试的服务端

经测试,运行稳定!Indy是开发工具C++builder 10.2.2 tokyo自带的通讯组件,本例证明,Indy系列通讯控件在UniGUI下能够正常使用。本例中用于模拟服务端的通讯模拟器是本人的开发作品,在某银行已经使用多年,加速了多个项目的模拟测试,如有兴趣,请加入我的QQ群,在文件共享"A01-我的开发作品"里找用户手册和产品介绍。

(中行雷威2018.3.10)(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943、860634510、299497712,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群)【阅读倡议】1、有问题请留言;2、没问题请点赞;...
(中行雷威2018.6.1) (同一个世界,同一个梦想,交流学习 C++ Builder XE 10 ,传承 c++ builder 的魅力!欢迎各地朋友加入我的QQ群484979943、8606345 10 、299497712,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。) 【阅读倡议】 1、有问题请留言; 2、没问题请点赞;
与Delphi本身相比, Uni GUI 也提供几组类似的非可视组件和可视组件。有些Delphi组件与 Uni GUI 兼容或受其支持,因此没有必要将它们包含在 Uni GUI 组件包中。例如,对于VCL和 Uni GUI 应用程序,许多数据访问 控件 是相同的。 Uni GUI 支持其他组件,比如TActionList。 Uni GUI 可视化 控件 是Ext JS 控件 (或由Ext JS 控件 组成),通常提供几...
这两天老大让我实现一个简单功能就是通过代码动态设定T ID TCPServer的Bindings属性,刚开始我觉得这个问题So Easy,但是做着做着总是出现同样一个错误不知道为什,这个问题一直纠结了我两天时间终于在今天早上得以解决,在此同大家分享一下在这个过程中我是如何解决这问题的,同时也给以后遇到同样问题的朋友做个参考。 1、首先我让然大家看一下我做得简单demo的界面 其功能时当点击bt
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uni GUI Types, uni GUI AbstractClasses, uni GUI Classes, uni GUI RegClasses, uni GUI Form, u...
(同一个世界,同一个梦想,交流学习 C++ Builder XE 10 ,传承 c++ builder 的魅力!欢迎各地朋友加入我的QQ群484979943,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。) Indy 控件 Id TCPClient 在发出连接指令后马上判断连接状态结果不准确,因为他属于线程模式,需要在OnConnect事件中才能准确获得结果,为此换用ClientSocket 控件 解决该问题
Uni GUI 的特殊对象主要有: Uni Application 对象、 Uni Session 对象、 Uni ServerInstance 对象,下面分类进行简单概括说明,后面实战中结合实例再详细讲述。 1)、 Uni Application 对象 Uni Application返回一个T Uni GUI Application实例,它是当前所有会话资源(主窗体MainForm、主模块...
实习生第一份工作做的是街机游戏,看到自己开发游戏给很多小孩子玩,爷的青春也就结束了,因为这一片都是做街机、VR,所以会接触到很多关于硬件设备的通信,到现在为止,还是挺喜欢这种基于硬件的游戏开发,做街机的时候,没做多久,所以当初最遗憾的事情就是没有学会串口通信,到现在为止,我觉得 Uni ty的串口类主要是一个收发消息的集成类。 懒的话可以直接下载 使用 ,直接拖进Asset里,附上码云链接:串口通信接收 【对于刚接触串口的同学们来说】 一定要了解串口的几个属性和串口接收助手的 使用 ,串口的属性在串口助手面板 vo id __fastcall TTCPDataServer::TCPServerExecute(T Id Context *AContext) AnsiString Str; Str=AContext->Connection->IOHandler->ReadLn(); if (Str=="")