标签:函数 amp delete close 使用 pre ++ soc ctf
上一个blog说了C++的实现方法,但是大黑框的显示未免显得有点太过于不美观,此次具体采用QT的方式进行实现,大致上的流程是这样的:
参考上面的流程图,大致上的实现模式就是这样,但是TCP通信的全双工的形式,所以收发信息的操作对客户端还是服务端而言都i是一样的,所以我们看看代码的实现模式:
首先是TCP的实现
1.先创建这样
然后一路往下点击下一步:
需要注意的是在这里我们选择这个:
接着看看代码:serverWidget.h
#ifndef SERVERWIDGET_H #define SERVERWIDGET_H #include <QWidget> #include<QTcpServer>//监听套接字 #include<QTcpSocket>//通信套接字 QT_BEGIN_NAMESPACE namespace Ui { class serverWidget; } QT_END_NAMESPACE class serverWidget : public QWidget { Q_OBJECT public: serverWidget(QWidget *parent = nullptr); ~serverWidget(); private slots: void on_pushButton_read_clicked(); void on_pushButton_write_clicked(); void on_pushButton_close_clicked(); private: Ui::serverWidget *ui; QTcpServer *server; QTcpSocket *socket_ser; }; #endif // SERVERWIDGET_H
serverWidget.cpp
#include "serverwidget.h" #include "ui_serverwidget.h" #include<QDebug> #include<QtNetwork> serverWidget::serverWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::serverWidget) { server=new QTcpServer(this); ui->setupUi(this); bool isok=server->listen(QHostAddress::Any,8888);//在QT中绑定和监听都使用的是listen函数 if(isok) { QString str1="监听成功。。。。。"; ui->textEdit_read->setText(str1); //等待来自客户端的链接触发一个事件Connect action connect(server,&QTcpServer::newConnection, [=]() { //配置上通信套接字 socket_ser=server->nextPendingConnection(); //获得对方的端口和IP QString ip=socket_ser->peerAddress().toString(); qint16 port =socket_ser->peerPort(); ui->textEdit_read->setText(QString("端口是%1,ip地址是%2").arg(port).arg(ip)); //读的时候会触发一个信号readyRead(). connect(socket_ser,&QTcpSocket::readyRead, [=](){ //从通信的套接字中拿出内容 QByteArray array=socket_ser->readAll(); ui->textEdit_read->append(array); } ); } ); } else { ui->textEdit_read->setText(QString("监听失败。。。。。")); } } serverWidget::~serverWidget() { delete ui; } void serverWidget::on_pushButton_write_clicked() { QString str=ui->textEdit_write->toPlainText(); socket_ser->write(str.toUtf8().data()); } void serverWidget::on_pushButton_close_clicked() { //进行套接字的关闭 socket_ser->disconnectFromHost();//通信套接字主动和端口断开链接 server->close(); }
UI的设置是这样的:
客户端的UI也是这样的设置
2.下面看看服务器的代码
clientWidget.h
#ifndef CLIENTWIDGET_H #define CLIENTWIDGET_H #include <QWidget> #include<QTcpSocket> QT_BEGIN_NAMESPACE namespace Ui { class clientWidget; } QT_END_NAMESPACE class clientWidget : public QWidget { Q_OBJECT public: clientWidget(QWidget *parent = nullptr); ~clientWidget(); private slots: void on_pushButton_write_clicked(); void on_pushButton_close_clicked(); private: Ui::clientWidget *ui; QTcpSocket *socket_client; }; #endif // CLIENTWIDGET_H
clientWidget.cpp
#include "clientwidget.h" #include "ui_clientwidget.h" #include<QtNetwork> clientWidget::clientWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::clientWidget) { ui->setupUi(this); socket_client=new QTcpSocket(this); socket_client->connectToHost("127.0.0.1",8888); //关于客户端的读取,客户端本身就是一个通信套接字的形式进行信息的收发 connect(socket_client,&QTcpSocket::readyRead, [=](){ QByteArray array= socket_client->readAll(); ui->textEdit_read->append(array); }); } clientWidget::~clientWidget() { delete ui; } void clientWidget::on_pushButton_write_clicked() { QString mystring=ui->textEdit_write->toPlainText(); socket_client->write(mystring.toUtf8().data()); } void clientWidget::on_pushButton_close_clicked() { socket_client->disconnectFromHost(); }
【remark】
通过和上一个C++版本的对比,显然可以看出QT的版本比较简单容易实现,但是值得注意的是要在pro的文件里面加上“QT += network”,并且在CPP文件中加上
#include<QtNetwork>
详细的运行结果如下:
关于QT上的TCP通信的实现(对比与VS 上C++的实现方式)
标签:函数 amp delete close 使用 pre ++ soc ctf
原文地址:https://www.cnblogs.com/dfxdd/p/12233072.html