上篇介绍了QT实现网络通信的服务器端,还没看服务器的朋友们先去上篇了解,这篇我来实现一下客户端的实现。
首先还是新建一个项目
选择mainwindow类
在通信前将.pro文件的第一行代码中追加network
窗口搭建
在mainwindow.ui中完成一下窗口的搭建
首先在最上端放一个QWidget在里面放入label输入端口,再放一个LineEdit,它的Objectname为port表示输入的端口号,在右边放一个Pushbutton输入连接,Objectname是connect
端口下面类似,LineEdit的Objectname是ip,PushButton的Objectname是disconnect
然后在下面放一个QGroupBox,name改为历史信息表示服务器客户端发送的信息都会保存在这,在里面放一个TextEdit,Objectname改为record再水平布局
下面类似,TextEdit的Objectname改为msg表示服务器要发送的信息,每次点击发送清空发送的信息框中的内容
最下面还是先放一个QGroupBox,中间放一个pushbutton输入发送,Objectname改为sendMsg,再水平布局
最后整体 垂直布局,这样服务器的窗口就搭建成功了
代码部分
mainwindow.h
首先在头文件的类中的private中定义要用到的套接字
槽函数,在Ui中的按钮右键转到槽函数,自动定义,用来实现连接,断开连接,发送等功能
mianwindow.cpp
在构造函数中对ui中的端口号、ip进行初始化,设置窗口标题为客户端,在未连接的时候将断开连接设置为不可使用;对头文件中定义的套接字进行实例化
三个connect,还是写在构造函数中;
第一个connct:如果服务器有消息发来,套接字就会收到一个readyRead的信号,使用匿名函数将发送来的内容追加到record中
第二个connect: 如果客户端连接到服务器,套接字就会收到connect的信号,使用匿名函数将成功连接发送到record中,如果连接成功就将连接按钮设置为不可操作,将断开连接按钮设置为可以操作
第三个connect:如果客户端与服务器断开连接,套接字会收到disconnect的信号,使用匿名函数将服务器已断开发送到record中,并将套接字关闭释放,如果断开就将连接按钮设置为可操作,将断开连接按钮设置为不可操作
点击按钮的三个槽函数的实现
点击senMsg就将msg文本框中的内容利用套接字write给服务器,然后再追加到record文本框中
点击connecr将ip和端口号保存,利用套接字中的connectToHost函数与服务器进行连接
点击disconnect将tcp套接字关闭,将连接按钮设置为可操作,断开连接设置为不可操作
通过以上步骤客户端也就实现完成了,以下是全部代码
全部代码
mianwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpSocket>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_sendMsg_clicked();
void on_connect_clicked();
void on_disconnect_clicked();
private:
Ui::MainWindow *ui;
QTcpSocket *tcp;
};
#endif // MAINWINDOW_H
mianwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostAddress>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->port->setText("8899");
ui->ip->setText("127.0.0.1");
setWindowTitle("客户端");
ui->disconnect->setDisabled(true);
tcp = new QTcpSocket(this);
connect(tcp,&QTcpSocket::readyRead,this,[=](){//如果tcp收到一个readyRead信号就
QByteArray data = tcp->readAll();//把内容读出来放到data里
ui->record->append("服务器say:" + data);//把内容追加到record中
});
connect(tcp,&QTcpSocket::connected,this,[=](){//如果套接字收到已连接消息,将成功连接发送到record中
ui->record->append("成功连接服务器!");
ui->disconnect->setDisabled(false);
ui->connect->setDisabled(true);
}) ;
connect(tcp,&QTcpSocket::disconnected,this,[=](){//如果套接字收到断联消息,就关闭套接字并释放
ui->record->append("服务器已断开!");
tcp->close();
tcp->deleteLater();
ui->disconnect->setDisabled(true);
ui->connect->setDisabled(false);
}) ;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_sendMsg_clicked()
{
QString msg = ui->msg->toPlainText();
tcp->write(msg.toUtf8());
ui->record->append("服务器say:" + msg);
ui->msg->clear();
}
void MainWindow::on_connect_clicked()
{
QString ip = ui->ip->text();//将ip地址赋值
unsigned short port = ui->port->text().toUShort();//将端口号赋值
tcp->connectToHost(QHostAddress(ip),port); //connecttoHost函数用来连接服务器
}
void MainWindow::on_disconnect_clicked()
{
tcp->close();
ui->disconnect->setDisabled(true);
ui->connect->setDisabled(false);
}
执行实例