森林笔记:Qt网络编程篇(一)--- TCP

本文详细介绍了QTcpSocket在TCP网络编程中的应用,涵盖了QTcpSocket的使用,包括TCP连接的建立、数据的读写以及QTcpServer的监听与处理新连接。通过实例展示了客户端和服务器端的聊天及文件传输操作,强调了QTcpSocket的异步工作模式和信号与槽的交互。
摘要由CSDN通过智能技术生成

一.前言

  1. TCP(Transmission Control Protocol,传输控制协议)是一个用于数据传输的低层网络协议,多个互联网协议(包括HTTP和FTP)都是基于TCP协议的。TCP是一个面向数据流和连接的可靠的传输协议。

  2. 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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值