一.前言
-
TCP(Transmission Control Protocol,传输控制协议)是一个用于数据传输的低层网络协议,多个互联网协议(包括HTTP和FTP)都是基于TCP协议的。TCP是一个面向数据流和连接的可靠的传输协议。
-
QTcpSocket 类 为TCP提供了一个接口,该类也继承自QAbstractSocket 。
2.1 QTcpSocket 类
-
可以使用QTcpSocket 来实现POP3、SMTP和NNTP等标准的网络协议,也可以实现自定义的网络协议。
-
与QUdpSocket 传输的数据报不同,QTcpSocket 传输的是数据流,尤其是连续的数据传输。
2.2 TCP编程一般分为客户端和服务器端,也就是所谓的C/S(Client/Server)模型。
(1) 在任何数据传输之前,必须建立一个TCP,连接到远程的主机和端口上。(2)一旦连接被建立,peer(对使用TCP协议连接在一起的主机的通称)的I端口和P地址可以分别使用QTcpSocket::peerPort() 和 QTcpSocket::peerAddress() 获取。
(3) 在任何时间,peer都可以关闭连接,这样数据传输就停止。QTcpSocket 是异步进行工作的,通过发送信号来报告状态改变和错误信息。,读取数据。
(4) QTcpSocket 类代表了两个独立的数据流,一个写入(QTcpSocket::write( ) ),一个读取(QTcpSocket::read( ) )。
QTcpSocket继承于QIODevice,可以使用QTextStream 和 QDataStream 。当从一个QTcpSocket 中读取数据,必须先调用 QTcpSocket::bytesAvailable( ) 函数来确保已经有足够的数据可用。(5) 如果要处理到来的TCP连接 ,则可以使用QTcpServer 类 ,调用QTcpServer::listen( ) 来监听,然后关联 QTcpServer::newConnection() 信号,每当有客户端连接时都会发射此信号。在对应的槽函数里调用QTcpServer::nextPendingConnection( ) 接收这个连接,然后使用该函数返回的QTcpSocket 对象于客户端通信。
二.QTcp应用:服务器与客户端的聊天
1.客户端
#include<QTextCodec>
/*************************************************
Copyright:
Author:Sen
Date:2020年7月8日
Description:
[1]客户端
[2]实现与服务器的收与发
**************************************************/
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle(tr("客户端"));
socket =new QTcpSocket(this);
connect(socket,&QIODevice::readyRead,this,&MainWindow::readData);
ui->textEdit_sender->clear();
}
MainWindow::~MainWindow()
{
delete ui;
}
/**
* @brief 读取数据
* @param
* @return
**/
void MainWindow::readData()
{
QByteArray msg = socket->readAll();
QTextCodec*code = QTextCodec::codecForName("UTF-8");
ui->textEdit_recvier->append(code->toUnicode(msg));
}
/**
* @brief 连接服务器
* @param
* @return
**/
void MainWindow::on_pushButton_link_clicked()
{
socket->connectToHost(ui->lineEditIp->text(),ui->lineEdit_port->text().toInt());
ui->textEdit_IP->setText( socket->peerName()) ;
}
/**
* @brief 清空输入
* @param
* @return
**/
void MainWindow::on_pushButton_clear_clicked()
{
ui->textEdit_sender->clear();
}
/**
* @brief 发送数据
* @param
* @return
**/
void MainWindow::on_pushButton_sender_clicked()
{
socket->write(ui->textEdit_sender->toPlainText().toUtf8());
ui->textEdit_sender->setFocus();
ui->textEdit_sender->clear();
}
服务器:
#include<QTextCodec>