三、设计TCP Client界面
这里我们可以使用Qt的Ui界面去设计,通过拖动控件放置窗口内。首先,我们需要先思考,作为TCP Client,需要填写些什么才能连上TCP Server呢?我想到的有:(1)远端IP,也就是作为TCP Server的设备的IP;(2)远端端口,也就是作为TCP Server的设备所暴露出来的端口号;(3)一个连接的按钮和一个清除显示的按钮。(4)一个能显示接收内容的文本显示框;(5)选择文本显示的数据格式,既然都说了是支持Modbus TCP协议的,那必不能少了选择显示的数据格式;如果想做高级点的,还可以加一个可选择“换行显示”的控件。既然都思考清楚了,那就开干吧!
3.1 放置控件
1.双击选择工程中的“tcp client.ui”,如图1所示
图1
2.先大致设计控件的布局,可根据自己的喜好设置,如图2所示
图2
3.将对应的控件,放置对应的位置。根据个人喜好设置,如图3所示
图3
4.修改控件的名字,如图4所示,右侧的控件命名不能带空格,中文;格式根据自己喜好设置,能看懂表达的意思就行。
图4
5.运行下,看看效果;如图5所示
图5
3.2 编写代码
注意:使用QT的网络套接字需要.pro文件中加入一句:
QT += network
捋一下逻辑:使用QT中的QTcpSocket类与服务器进行通信需要以下5步:
(1)创建QTcpSocket套接字对象
(2)使用这个对象连接服务器
(3)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
(4)使用write函数向服务器发送数据
(5)断开与服务器的连接
OK,开干吧!
3.2.1 创建QTcpSocket套接字对象
千万别忘了在.h文件里面加这两句哦,不然要报错了!!!
3.2.2 使用这个对象连接服务器
tcp_client.cpp文件的部分代码,以下主要是通过点击连接按钮实现与TCP Server的连接与断开连接,代码中也有清晰的注释。
#include "tcp_client.h"
#include "ui_tcp_client.h"
TCP_Client::TCP_Client(QWidget *parent)
: QWidget(parent)
, ui(new Ui::TCP_Client)
{
ui->setupUi(this);
//创建Socket对象
socket =new QTcpSocket();
//使能按键
ui -> Socket_Connect -> setEnabled(true);
//设置默认显示的远端IP
ui -> Remote_IP -> setText("192.168.0.23");
//设置默认显示的远端端口号
ui ->Remote_port ->setText("7890");
}
TCP_Client::~TCP_Client()
{
delete ui;
delete this ->socket;
}
//通过“连接”按钮控制与TCP Server的连接
void TCP_Client::on_Socket_Connect_clicked()
{
//判断pushbottom的状态
if(ui ->Socket_Connect ->text() == tr("连接"))
{
//定义两个变量,用来获取IP和端口号
QString remote_ip;
int remote_port;
//获取远端IP
remote_ip = ui -> Remote_IP -> text();
//获取远端端口号
remote_port = ui -> Remote_port -> text().toInt();
//取消已有的连接
socket -> abort();
//连接服务端
socket -> connectToHost(remote_ip,remote_port);
//等待连接成功
if(!socket ->waitForConnected(3000))
{
qDebug() << "连接失败";
return;
}
qDebug() << "连接成功";
//发送按键使能
ui -> Socket_Connect -> setEnabled(true);
//修改按键显示的文字
ui ->Socket_Connect -> setText("断开连接");
}
else
{
//断开连接
socket ->disconnectFromHost();
//发送按键使能
ui -> Socket_Connect -> setEnabled(true);
//修改按键显示的文字
ui ->Socket_Connect -> setText("连接");
}
}
可以打开一个网络调试助手,测试是否能连接上,该部分代码运行后的效果如下图所示: