QTcpSocket
一、QT中的网络 network:
二、windows上的TCP编程模型和代码
三、QT上的TCP编程模型
服务器 | 客户端 |
---|---|
1.创建QTcpServer对象 相当于 windows的第1步 | 1.创建QTcpSocket对象 |
2.监听 QTcpServer类的listen函数 相当于 windows的第2,3,4步 | 2.连接服务器 QTcpSocket类的connectToHost函数,关联connected信号检查是否连接 |
3.等待客户端连接 | 3.通信 |
3.1QTcpServer类的newConnection信号 | 3.1 接收数据QTcpSocket 的 readyRead信号的槽使用QTcpSocket readAll()函数 |
3.2通过QTcpServer类的nextPendingConection函数来返回客户端的QTcpSocket类对象 | 3.2 发送数据QTcpSocket 的 write 函数 |
4.通信 | 4.断开连接 |
4.1 接收数据QTcpSocket 的 readyRead信号的槽使用QTcpSocket的 readAll函数获取内容 | – |
4.2 发送数据QTcpSocket 的 write 函数 | |
5.断开QTcpSocket连接disconnectFromHost Close |
示例:
第一步 加入network模式:
第二步 创建客户端和服务器:
1.添加服务器界面:
将textEditRecv改为只读
2.添加客户端界面
创建客户端界面:
设计客户端ui界面:
第三步连接:
服务器:
1.创建QTcpServer对象 相当于 windows的第1步
2.监听
QTcpServer类的listen函数 相当于 windows的第2,3,4步
3.等待客户端连接
3.1QTcpServer类的Conection 信号
3.2通过QTcpServer类的nextPendingConection函数来返回客户端的QTcpSocket
(显示:
3.3获取客户端IP地址和端口号
3.4显示在某个地方 ui->textEditRevc()
widget.h
加入头文件:
#include <QWidget>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDebug>
创建对象:
QTcpServer *pTcpServer;
QTcpSocket *pTcpSocket;
widget.cpp
setWindowTitle("服务器");
//1.创建QTcpServer对象
pTcpServer =new QTcpServer(this);//指定父对象,让他可以自动回收内存
pTcpSocket =NULL;
//2.监听
pTcpServer->listen(QHostAddress::Any,10086);
//3.等待客户端连接
//3.1关联信号与槽
connect(pTcpServer,&QTcpServer::newConnection,
[=](){
//3.2 获取客户端socket
pTcpSocket= pTcpServer->nextPendingConnection();
qDebug()<<"客户端连接服务器成功";
//3.3获取客户端IP地址和端口号
QString ipstr=pTcpSocket->peerAddress().toString();
quint16 portUint= pTcpSocket->peerPort();
QString buff=QString("客户端IP%1,客户端端口号%2").arg(ipstr).arg(portUint) ;
//3.4显示在某个地方 ui->textEditRevc
ui->textEditRecv->setText(buff);
})
客户端:
1.创建QTcpSocket对象
2.连接服务器
QTcpSocket类的connectToHost函数
通过QTcpSocket类的connectToHost信号 知道 已经连接上服务器了
2.1获取用户输入的IP地址和端口号连接
2.2 连接服务器
2.3 关联信号与槽,检查是否连接上了服务器
clientwidget.h
头文件:
#include <QWidget>
#include <QTcpSocket>
#include <QTcpServer>
创建三个槽函数:
private slots:
void on_BtnConent_clicked();
void on_BtnSend_clicked();
void on_BtnClose_clicked();
创建对象:
QTcpSocket* pTcpSocket;
clientwidget.cpp实现槽函数的连接:
void ClientWidget::on_BtnConent_clicked()
{
//2.1获取用户输入的IP地址和端口号连接
QString ipStr=ui->lineEditIP->text();
quint16 portUint= ui->lineEditport->text().toUInt();
//2.2 连接服务器
pTcpSocket->connectToHost(ipStr,portUint);
}
关联信号与槽,检查是否连接上了服务器
在ClientWidget中写
//2.3 关联信号与槽,检查是否连接上了服务器
connect(pTcpSocket,&QTcpSocket::connected,
[=](){
ui->textEditRecv->setText("连接服务器成功");
});
四、通信:
服务器:
4.1 接收数据
QTcpSocket 的 readyRead信号
QTcpSocket的 readAll函数
4.2 发送数据
QTcpSocket 的 write 函数
widget.cpp
接收(在等待客户端连接的槽函数中写):
connect(pTcpSocket,&QTcpSocket::readyRead,
[=](){
QByteArray data=pTcpSocket->readAll();
ui->textEditRecv->append(data);
});
发送(在按钮的槽函数中写):
//4.2发送数据 服务器发送到客户端
void Widget::on_BtnSend_clicked()
{
if(pTcpSocket)
{
QString str=ui->textEditSend->toPlainText();
pTcpSocket->write(str.toUtf8().data());
}
}
客户端
3.1 接收数据
QTcpSocket 的 readyRead信号
QTcpSocket的 readAll函数
3.2 发送数据
QTcpSocket 的 write 函数
接收:
定义一个bool类型的变量:
bool connected;
初始化为false;
连接成功后为true;
在服务器连接成功的客户端上抄:
connect(pTcpSocket,&QTcpSocket::readyRead,
[=](){
QByteArray data=pTcpSocket->readAll();
ui->textEditRecv->append(data);
});
发送(在按钮的槽函数中写):
void ClientWidget::on_BtnSend_clicked()
{
if(connected)//判断是否连接
{
QString str=ui->textEditSend->toPlainText();
pTcpSocket->write(str.toUtf8().data());
qDebug()<<"发送成功";
}
}
五、断开连接
客户端中写:
void Widget::on_BtnClose_clicked()
{
if(pTcpSocket)
{
pTcpSocket->disconnectFromHost();
pTcpSocket->close();
}
}
服务器中同样:
void Widget::on_BtnClose_clicked()
{
if(pTcpSocket)
{
pTcpSocket->disconnectFromHost();
pTcpSocket->close();
}
}
全部代码:
服务器widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTcpSocket>
#include<QTcpServer>
#include<QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_BtnSend_clicked();
void on_BtnClose_clicked();
private:
Ui::Widget *ui;
QTcpServer *pTcpServer;
QTcpSocket *pTcpSocket;
};
#endif // WIDGET_H
服务器widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowTitle("服务器");
//1.创建QTcpServer对象
pTcpServer =new QTcpServer(this);//指定父对象,让他可以自动回收内存
pTcpSocket =NULL;
//2.监听
pTcpServer->listen(QHostAddress::Any,10086);
//3.等待客户端连接
//3.1关联信号与槽
connect(pTcpServer,&QTcpServer::newConnection,
[=](){
//3.2 获取客户端socket
pTcpSocket= pTcpServer->nextPendingConnection();
qDebug()<<"客户端连接服务器成功";
//3.3获取客户端IP地址和端口号
QString ipstr=pTcpSocket->peerAddress().toString();
quint16 portUint= pTcpSocket->peerPort();
QString buff=QString("客户端IP%1,客户端端口号%2").arg(ipstr).arg(portUint) ;
//3.4显示在某个地方 ui->textEditRevc
ui->textEditRecv->setText(buff);
//4. 通信
//4.1 收 服务器接受客户端数据
connect(pTcpSocket,&QTcpSocket::readyRead,
[=](){
QByteArray data=pTcpSocket->readAll();
ui->textEditRecv->append(data);
});
});
}
Widget::~Widget()
{
delete ui;
}
//4.2发送数据 服务器发送到客户端
void Widget::on_BtnSend_clicked()
{
if(pTcpSocket)
{
QString str=ui->textEditSend->toPlainText();
pTcpSocket->write(str.toUtf8().data());
}
}
void Widget::on_BtnClose_clicked()
{
if(pTcpSocket)
{
pTcpSocket->disconnectFromHost();
pTcpSocket->close();
}
}
客户端clientwidget.h
#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H
#include <QWidget>
#include<QTcpSocket>
#include<QTcpServer>
namespace Ui {
class ClientWidget;
}
class ClientWidget : public QWidget
{
Q_OBJECT
public:
explicit ClientWidget(QWidget *parent = nullptr);
~ClientWidget();
private slots:
void on_BtnConent_clicked();
void on_BtnSend_clicked();
void on_BtnClose_clicked();
private:
Ui::ClientWidget *ui;
//QTcpServer *pTcpserver;
QTcpSocket* pTcpSocket;
bool connected;
};
#endif // CLIENTWIDGET_H
客户端clientwidget.cpp
#include "clientwidget.h"
#include "ui_clientwidget.h"
ClientWidget::ClientWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::ClientWidget)
{
ui->setupUi(this);
setWindowTitle("客户端");
//1.创建QTcpSocket对象
pTcpSocket =new QTcpSocket(this);
connected=false;
//2.3 关联信号与槽,检查是否连接上了服务器
connect(pTcpSocket,&QTcpSocket::connected,
[=](){
ui->textEditRecv->setText("连接服务器成功");
connected=true;
//3.1 收 客户端接受服务器
connect(pTcpSocket,&QTcpSocket::readyRead,
[=](){
QByteArray data=pTcpSocket->readAll();
ui->textEditRecv->append(data);
});
});
}
ClientWidget::~ClientWidget()
{
delete ui;
}
//2.连接服务器
void ClientWidget::on_BtnConent_clicked()
{
//2.1获取用户输入的IP地址和端口号连接
QString ipStr=ui->lineEditIP->text();
quint16 portUint= ui->lineEditport->text().toUInt();
//2.2 连接服务器
pTcpSocket->connectToHost(ipStr,portUint);
}
//4发送数据 客户端 发送到 服务器
void ClientWidget::on_BtnSend_clicked()
{
if(connected)
{
QString str=ui->textEditSend->toPlainText();
pTcpSocket->write(str.toUtf8().data());
qDebug()<<"发送成功";
}
}
void ClientWidget::on_BtnClose_clicked()
{
if(pTcpSocket)
{
pTcpSocket->disconnectFromHost();
pTcpSocket->close();
}
}
main.cpp
#include "widget.h"
#include"clientwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ClientWidget cw;
Widget w;
w.show();
cw.show();
return a.exec();
}