简介
本次主要总结学习到的TCP相关知识,并在Qt完成一个本地的TCP通讯的小项目
概念
TCP/IP协议中的传输层协议包括TCP和UDP
1、TCP是一种面向连接的可靠的传输层通讯协议,面向连接即 客户端---服务器
特点:面向连接,有序号,和有序号和确认序号、排序检错、失败重传、用于大文件传输、不支持广播。
实例:HTTP,FTP
2、UDP是一种面向无连接的传输层通信协议。
特点:面向无连接、没有序号和确认序号、不排序检错、不失败重传、简单应答服务、支持广播、多播。
TCP的架构

qt中Tcp通讯的流程(来自于代码)
服务端
- 创建QTcpServer--------------------------m_s = new QTcpServer(this);
- 监听状态----------------------------------m_s->listen(QHostAddress::Any,port);
- 监测客户端连接----------connect(m_s,&QTcpServer::newConnection,this,[=](){
- 获得连接-------------------------m_tcp = m_s->nextPendingConnection();
- 连接对端接收信号---------------connect(m_tcp,&QTcpSocket::readyRead,this,[=](){
- 读取客户端消息---------------QByteArray data = m_tcp->readAll();
- 发送数据-------------------------------------------m_tcp->write(msg.toUtf8());
- 关闭连接----------------------------------------m_tcp->close();
客户端
- 实例化QTcpSocket对象
- 连接服务器--connectToHost
- 连接对端接收信号--readyRead
- 发送数据--write()
- 关闭连接--disconnectFromHost()
API QTcpSokect&QTcpServer
1.qt工程的.pro中加入network
QT += core gui network
2.头文件
#include <QTcpServer>
#include <QTcpSocket>
3.API
singnals:
readyRead()//对端发送消息
newConnection()//TcpServer创建新连接
disconnected()//断开连接
QTcpSocket *nextPendingConnection();//挂起请求产生一个QTcpSocket指针
//监听端口和地址
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
//连接到指定的端口和地址
virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
Qt实现本地TCP通讯项目
项目学习来源:B站 “爱编程的大丙” 老师 老师讲的很好,有时间可以去好好看一下
主打学习分享,如有侵权及时通知删除
效果图:
代码实现:
TcpServer
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_StartServer_clicked();
void on_sendMsgButton_clicked();
private:
Ui::MainWindow *ui;
QTcpServer *m_s;
QTcpSocket *m_tcp;
QLabel *m_status;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->port->setText("8899");
setWindowTitle("服务端");
m_s = new QTcpServer(this);
connect(m_s,&QTcpServer::newConnection,this,[=](){
m_tcp = m_s->nextPendingConnection();
m_status->setPixmap(QPixmap(":/res/right.jpeg").scaled(20,20));
connect(m_tcp,&QTcpSocket::readyRead,this,[=](){
QByteArray data = m_tcp->readAll();
ui->record->append("客户端say:"+data);
});
connect(m_tcp,&QTcpSocket::disconnected,this,[=](){
m_tcp->close();
m_status->setPixmap(QPixmap(":/res/false.jpg").scaled(20,20));
});
});
m_status = new QLabel;
m_status->setPixmap(QPixmap(":/res/false.jpg").scaled(20,20));
ui->statusbar->addWidget(new QLabel("连接状态"));
ui->statusbar->addWidget(m_status);
}
MainWindow::~MainWindow()
{
delete ui;
if(m_tcp){
m_tcp->close();
m_tcp->deleteLater();
}
}
void MainWindow::on_StartServer_clicked()
{
unsigned short port = ui->port->text().toUShort();
m_s->listen(QHostAddress::Any,port);
ui->StartServer->setDisabled(true);
}
void MainWindow::on_sendMsgButton_clicked()
{
QString msg = ui->sendMsg->toPlainText();
m_tcp->write(msg.toUtf8());
ui->record->append("服务端say:"+ msg);
}
TcpClient
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpSocket>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_sendMsgButton_clicked();
void on_connect_clicked();
void on_disconnect_clicked();
private:
Ui::MainWindow *ui;
QTcpSocket *m_tcp;
QLabel *m_status;
};
#endif // MAINWINDOW_H
#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);
m_tcp = new QTcpSocket(this);
connect(m_tcp,&QTcpSocket::readyRead,this,[=](){
QByteArray data = m_tcp->readAll();
ui->record->append("服务端say:"+data);
});
connect(m_tcp,&QTcpSocket::disconnected,this,[=](){
m_tcp->close();
m_status->setPixmap(QPixmap(":/res/false.jpg").scaled(20,20));
ui->record->append("已经断开连接");
ui->connect->setDisabled(false);
ui->disconnect->setEnabled(false);
});
connect(m_tcp,&QTcpSocket::connected,this,[=](){
m_status->setPixmap(QPixmap(":/res/right.jpeg").scaled(20,20));
ui->record->append("已经成功连接到服务器");
ui->connect->setDisabled(true);
ui->disconnect->setEnabled(true);
});
m_status = new QLabel;
m_status->setPixmap(QPixmap(":/res/false.jpg").scaled(20,20));
ui->statusbar->addWidget(new QLabel("连接状态"));
ui->statusbar->addWidget(m_status);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_sendMsgButton_clicked()
{
QString msg = ui->sendMsg->toPlainText();
m_tcp->write(msg.toUtf8());
ui->record->append("客户端say:"+ msg);
}
void MainWindow::on_connect_clicked()
{
QString ip = ui->ip->text();
unsigned short port = ui->port->text().toUShort();
m_tcp->connectToHost(QHostAddress(ip),port);
}
void MainWindow::on_disconnect_clicked()
{
m_tcp->close();
ui->connect->setDisabled(false);
ui->disconnect->setEnabled(false);
}
3171


&spm=1001.2101.3001.11974&articleId=145068111&d=1&t=3&u=2c019cf2a31e47b3acd435f3f35ddc44)

被折叠的 条评论
为什么被折叠?



