TCP/IP(Transmission Control Protocol/Internet Protocol)是一组通信协议,用于在网络上实现数据传输。它是互联网的基础,也被广泛用于局域网和广域网中。TCP/IP协议族由多个协议组成,其中最重要的是TCP和IP。
-
IP(Internet Protocol):负责在网络上唯一标识设备和路由数据包。IP地址是一个32位或128位的数字,用于标识网络上的设备。IPv4和IPv6是两个主要版本,分别使用32位和128位地址。
-
TCP(Transmission Control Protocol):提供可靠的、面向连接的数据传输服务。TCP负责将数据分割成数据包,确保它们按顺序到达目的地,并处理丢失的数据包或错误。TCP建立连接、传输数据和断开连接。
-
UDP(User Datagram Protocol):与TCP相比,UDP是一种无连接的传输协议,它不保证数据传输的可靠性。UDP更适用于实时应用程序,如音频和视频流,因为它速度快,但不提供错误检查和重传功能。
TCP/IP协议族还包括其他协议,如HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)等,用于支持不同类型的网络应用。
TCP/IP协议为数据在网络上的传输提供了可靠性和灵活性,使得不同类型的设备和系统能够互相通信。在互联网和大多数网络中,TCP/IP协议是通信的基础,确保数据能够安全、高效地传输。
提供一个TCP 服务端和TCP 客户端的最小demo,便于和海康VisionMaster软件进行通信测试。
目录
- TCP 服务端
- TCP 客户端
- 源码地址
TCP 服务端
tcpserver.h
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui {
class TcpServer;
}
QT_END_NAMESPACE
class TcpServer : public QMainWindow
{
Q_OBJECT
public:
TcpServer(QWidget *parent = nullptr);
~TcpServer();
private slots:
void on_pbn_set_listen_clicked();
void on_pbn_send_data_clicked();
private:
Ui::TcpServer *ui;
QTcpServer *server_{ nullptr };
QTcpSocket *tcp_{ nullptr };
QLabel *status_{ nullptr };
};
#endif // TCPSERVER_H
tcpserver.cpp
#include "tcpserver.h"
#include "./ui_tcpserver.h"
TcpServer::TcpServer(QWidget *parent)
: QMainWindow(parent), ui(new Ui::TcpServer)
{
ui->setupUi(this);
ui->le_port->setText("8899");
// 第一步:创建监听的服务对象
server_ = new QTcpServer(
this); // 指定实例化父类this,即QMainWindow,待页面析构时,server_也被析构
// 第三步:通过 QTcpServer::newConnection()信号检测是否有新的客户端连接
// 如果有新的客户端连接调用 QTcpSocket *QTcpServer::nextPendingConnection()
// 得到通信的套接字对象
connect(server_, &QTcpServer::newConnection, this, [=]() {
tcp_ = server_->nextPendingConnection();
ui->txe_record->append("成功和客户端建立了新的连接...");
status_->setPixmap(QPixmap(":/resources/connect.png").scaled(20, 20));
// 检测是否有客户端数据
connect(tcp_, &QTcpSocket::readyRead, this, [=]() {
// 接收数据
QByteArray data = tcp_->readAll();
ui->txe_record->append("客户端Say:" + data);
});
// 检测客户端是否断开了连接
connect(tcp_, &QTcpSocket::disconnected, this, [=]() {
ui->txe_record->append("客户端已经断开了连接...");
tcp_->deleteLater();
status_->setPixmap(
QPixmap(":/resources/disconnect.png").scaled(20, 20));
});
});
// 设置连接状态的状态栏
status_ = new QLabel(this);
status_->setPixmap(QPixmap(":/resources/disconnect.png").scaled(20, 20));
ui->statusbar->addWidget(new QLabel("连接状态:"));
ui->statusbar->addWidget(status_);
}
TcpServer::~TcpServer()
{
delete ui;
}
// 第二步:通过 QTcpServer 对象设置监听,即:QTcpServer::listen()
void TcpServer::on_pbn_set_listen_clicked()
{
unsigned short port = ui->le_port->text().toUShort();
// 设置服务器监听
server_->listen(QHostAddress::Any, port);
ui->pbn_set_listen->setEnabled(false);
}
void TcpServer::on_pbn_send_data_clicked()
{
// 将txe_send_message中输入内容转为纯文本的QString形式
QString msg = ui->txe_send_message->toPlainText();
// 将QSting类型转为QByteArray类型
tcp_->write(msg.toUtf8());
ui->txe_record->append("服务端Say:" + msg);
ui->txe_send_message->clear();
}
TCP 客户端
tcpclient.h
#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <QMainWindow>
#include <QTcpSocket>
#include <QHostAddress>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui {
class TcpClient;
}
QT_END_NAMESPACE
class TcpClient : public QMainWindow
{
Q_OBJECT
public:
TcpClient(QWidget *parent = nullptr);
~TcpClient();
private slots:
void on_pbn_connect_clicked();
void on_pbn_disconnect_clicked();
void on_pbn_send_message_clicked();
private:
Ui::TcpClient *ui;
QTcpSocket *tcp_{ nullptr };
QLabel *status_{ nullptr };
};
#endif // TCPCLIENT_H
tcpclient.cpp
#include "tcpclient.h"
#include "./ui_tcpclient.h"
TcpClient::TcpClient(QWidget *parent)
: QMainWindow(parent), ui(new Ui::TcpClient)
{
ui->setupUi(this);
ui->le_port->setText("8000");
ui->le_ip->setText("127.0.0.1");
ui->pbn_disconnect->setEnabled(false);
// 创建通信的套接字对象
tcp_ = new QTcpSocket(this);
// 检测服务器是否回复了数据
connect(tcp_, &QTcpSocket::readyRead, [=] {
// 接收服务器发送的数据
QByteArray recv_msg = tcp_->readAll();
ui->txe_message->append("服务器Say: " + recv_msg);
});
// 检测是否和服务器是否连接成功了
connect(tcp_, &QTcpSocket::connected, this, [=]() {
ui->txe_message->append("恭喜, 连接服务器成功!!!");
status_->setPixmap(QPixmap(":/resources/connect.png").scaled(20, 20));
ui->pbn_connect->setEnabled(false);
ui->pbn_disconnect->setEnabled(true);
});
// 检测服务器是否和客户端断开了连接
connect(tcp_, &QTcpSocket::disconnected, this, [=]() {
ui->txe_message->append("服务器已经断开了连接...");
ui->pbn_connect->setEnabled(true);
ui->pbn_disconnect->setEnabled(false);
status_->setPixmap(
QPixmap(":/resources/disconnect.png").scaled(20, 20));
});
// 设置连接状态的状态栏
status_ = new QLabel(this);
status_->setPixmap(QPixmap(":/resources/disconnect.png").scaled(20, 20));
ui->statusbar->addWidget(new QLabel("连接状态:"));
ui->statusbar->addWidget(status_);
}
TcpClient::~TcpClient()
{
delete ui;
}
void TcpClient::on_pbn_connect_clicked()
{
QString ip = ui->le_ip->text();
unsigned short port = ui->le_port->text().toInt();
// 连接服务器
tcp_->connectToHost(QHostAddress(ip), port);
ui->pbn_connect->setEnabled(false);
ui->pbn_disconnect->setEnabled(true);
}
void TcpClient::on_pbn_disconnect_clicked()
{
tcp_->close();
ui->pbn_connect->setEnabled(true);
ui->pbn_disconnect->setEnabled(false);
}
void TcpClient::on_pbn_send_message_clicked()
{
QString send_msg = ui->txe_send_message->toPlainText();
tcp_->write(send_msg.toUtf8());
ui->txe_message->append("客户端Say: " + send_msg);
ui->txe_send_message->clear();
}
源码地址
https://gitee.com/boss-dog/tcp_client
https://gitee.com/boss-dog/tcp-server