QT TCP 简单编程了解原理

这里的内容主要参考《Qt Creator 快速入门》的18章节的TCP部分~
刚开始不懂TCP传输的什么服务端客户端,以及监听等概念,自己敲完一遍代码后,了解的更加清楚了~

先说一下,要实现的功能很简单:
服务器一直监听一个端口,一旦有客户端连接请求,便建立连接,并向客户端发送一个字符串,然后客户端接受该字符串并显示出来。

实现效果界面如图:
刚开始先运行服务器端的程序,界面上有一个label显示“等待连接。。。”
这里写图片描述
之后运行客户端的程序,界面上要求输入你要连的主机和端口号(我在服务器端设置的监听端口号是6666,所以这里我会填主机是“localhost”,表示本主机,端口号填6666),然后点击连接按钮(我在这个按钮的槽函数下设置了一个连接服务器的槽函数)
这里写图片描述
运行结果图:
当点击客户端的连接后,立马与服务器端进行了连接,并且此时服务器端给客户端发送了字符串,服务器端也收到了,就是图片上的“hello TCP”
这里写图片描述

这里写图片描述
主要代码:
服务器端:
项目名称为tcpserver,类名为Server
头文件
server.h

#ifndef SERVER_H
#define SERVER_H
#include<QTcpServer>
#include <QDialog>

namespace Ui {
class Server;
}

class Server : public QDialog
{
    Q_OBJECT

public:
    explicit Server(QWidget *parent = 0);
    ~Server();

private:
    Ui::Server *ui;
    QTcpServer *tcpServer;
private slots:
    void sendMessage();
};

#endif // SERVER_H

server.cpp

#include<QtNetwork>
#include "server.h"
#include "ui_server.h"
#include<QDebug>
#include<QByteArray>
#include<QDataStream>
#include<QTcpSocket>
Server::Server(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Server)
{
    ui->setupUi(this);
    tcpServer=new QTcpServer(this);
    if(!tcpServer->listen(QHostAddress::Any,6666))//开始监听任何连在6666端口的IP地址
    {
        qDebug()<<tcpServer->errorString();
        close();
    }
    connect(tcpServer,&QTcpServer::newConnection,this,&Server::sendMessage);//当有客户端连接过来时,发射sendMessage

}

Server::~Server()
{
    delete ui;
}
void Server::sendMessage()
{
    QByteArray block;
    QDataStream out(&block,QIODevice::WriteOnly);//用block来暂时存放要发送的数据
    out.setVersion(QDataStream::Qt_5_5);//设置数据流的版本,客户端和服务器端的版本要相同
    //在发送数据时,一定要在最开始写入实际数据的大小信息,该大小信息占用两个字节,可以使用(quint16)0来表示
    out<<(quint16)0;//但是在写入数据前可能不知道实际数据大小信息,所以要在数据块的最前面留两个自己的位置,以便以后填写数据大小的信息
    out<<tr("hello TCP!");//这里输入实际的数据
    out.device()->seek(0);//seek(0)跳转到数据块的开头
    out<<(quint16)(block.size()-sizeof(quint16));//数据块总大小-数据块开头两个字节的大小获得数据实际大小,写入开头空着的位置

    QTcpSocket *clientConnection=tcpServer->nextPendingConnection();//获取已经建立连接的套接字
    connect(clientConnection,&QTcpSocket::disconnected,clientConnection,&QTcpSocket::deleteLater);//当连接断开时删除该套接字
    clientConnection->write(block);//用write函数,将数据发送出去
    clientConnection->disconnectFromHost();//该函数表明会一直等待套接字将所有数据发送完毕,然后关闭该套接字
    ui->label->setText(tr("发送数据成功!"));

}

可以看到,编写TCP服务器端程序时可以使用QTcpServer类,然后调用它的listen()函数进行监听。要对连接过来的客户端进行操作时,可以通过关联newConnection()信号在槽中进行

客户端
项目名称为tcpclient,类名为Client
client.h

#ifndef CLIENT_H
#define CLIENT_H
#include<QTcpSocket>
#include <QDialog>

namespace Ui {
class Client;
}

class Client : public QDialog
{
    Q_OBJECT

public:
    explicit Client(QWidget *parent = 0);
    ~Client();

private:
    Ui::Client *ui;
    QTcpSocket *tcpSocket;
    QString message;
    quint16 blocksize;
private slots:
    void newConnect();
    void readmessage();
    void displayError(QAbstractSocket::SocketError);
    void on_pushButton_connect_clicked();
};

#endif // CLIENT_H

client.cpp

#include "client.h"
#include "ui_client.h"
#include<QtNetwork>
#include<QDataStream>
Client::Client(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);
    tcpSocket=new QTcpSocket(this);
    connect(tcpSocket,&QTcpSocket::readyRead,this,&Client::readmessage);
    connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));

}

Client::~Client()
{
    delete ui;
}
void Client::newConnect()
{
    blocksize=0;//初始化数据大小为0
    tcpSocket->abort();//取消了当前已经存在的连接,并且重置套接字
    //连接到指定主机的指定端口
    tcpSocket->connectToHost(ui->lineEdit_Host->text(),ui->lineEdit_Port->text().toInt());
}
void Client::readmessage()
{
    QDataStream in(tcpSocket);//数据流入套接字
    in.setVersion(QDataStream::Qt_5_5);
    //如果是刚开始接收数据,因为初始化大小为0
    if(blocksize==0)
    {
        //判断所接收的数据是否大于两个字节,也就是文件的大小信息的空间
        //如果是,则把文件大小信息保存到blocksize
        if(tcpSocket->bytesAvailable()<(int)sizeof(quint16))
            return;
        in>>blocksize;//发送和接收的数据流都是有自己的格式的,比如,自己定义的quint16 blocksize;

    }
    //如果没有得到全部的数据,则返回,继续接收数据
    if(tcpSocket->bytesAvailable()<blocksize)
        return;
    in>>message;
    ui->label_message->setText(message);

}
void Client::displayError(QAbstractSocket::SocketError)
{
    qDebug()<<"test";
    qDebug()<<tcpSocket->errorString();
}

void Client::on_pushButton_connect_clicked()
{
    newConnect();
}

整个过程是这样的:启动服务器端,开始监听端口,客户端单击“连接,调用newConnect()槽,然后客户端向服务器发送连接请求,这时服务器调用sendMessage()槽,发送字符串,客户端接收到字符串时,调用readMessage()槽将字符串显示出来。”

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: CSDN是一个专门面向程序员的技术社区,提供了丰富的技术文章、视频教程和在线问答等服务,方便程序员们学习和交流。而Qt是一种跨平台的桌面应用程序开发框架,它提供了丰富的工具和类库,使得开发者可以更加便捷地开发出美观、功能强大的应用程序。TCP则是一种常见的网络传输协议,它在网络通信中起到了重要的作用。 在CSDN上,有很多关于QtTCP的相关文章和教程。程序员们可以通过这些资源来学习和了解如何使用Qt框架开发自己的应用程序,并且通过TCP协议实现网络通信。这些教程和文章通常包括了基本的Qt框架介绍、TCP协议的原理和使用方法等内容,可以帮助程序员们快速入门并掌握相关的技术。 使用Qt开发应用程序时,通常需要涉及到用户界面的设计和实现、数据的处理和存储、以及与后端服务器的通信等功能。而TCP协议则是一种可靠的网络传输协议,它能够保证数据的可靠传输和顺序性,因此在网络通信中被广泛应用。程序员们可以通过学习如何使用Qt中的网络类库,建立TCP连接并进行数据的传输。 总的来说,CSDN上关于QtTCP的教程和文章提供了很好的学习资源,帮助程序员们学习和掌握如何使用Qt框架开发自己的应用程序,并通过TCP协议实现网络通信。这些教程和文章的存在为程序员们提供了更多的学习和交流的机会,使得开发者们能够更加便捷地使用这些技术来实现自己的应用程序和项目。 ### 回答2: CSDN是一个开发者社区,提供了丰富的技术文章、博客、论坛以及资源下载等服务。Qt是一个跨平台的应用程序开发框架,它提供了丰富的GUI和网络编程功能,能够帮助开发者快速地构建出高质量的应用程序。TCP是一种网络传输协议,它提供了可靠的、面向连接的数据传输方式。在Qt中,我们可以使用Qt Network模块来进行TCP网络编程Qt提供了一个QTcpSocket类,可以在客户端服务器端进行TCP连接。我们可以通过调用QTcpSocket类的相关方法来实现数据的发送和接收。例如,我们可以使用QTcpSocket的connectToHost()方法来与服务器建立连接,使用write()方法发送数据,使用readyRead()信号和read()方法来接收数据。同时,QTcpSocket还提供了一些其他方法,如isReadable()来判断是否有数据可读,isWritable()来判断是否能够写入数据等。 除了QTcpSocket类,Qt还提供了QTcpServer类,用于实现服务器端TCP监听和连接管理。我们可以使用QTcpServer的listen()方法来监听指定的端口,通过newConnection()信号和nextPendingConnection()方法来接受客户端连接求,然后使用返回的QTcpSocket对象进行数据的通信。 在CSDN上,有很多关于Qt TCP网络编程的教程和示例代码,可以帮助开发者快速入门和理解相关概念。通过学习这些资源,我们可以掌握在Qt中进行TCP通信的基本方法和技巧,从而能够使用Qt构建出功能强大的网络应用程序。 ### 回答3: CSDN是一个面向IT技术开发人员的社区平台,其中有丰富的技术资源和开发者分享的经验,而Qt是一款跨平台的C++应用程序开发框架,可用于开发图形界面及网络通信等应用。 TCP是传输控制协议(Transmission Control Protocol)的简称,它是一种面向连接的、可靠的、基于字节流的传输层协议。在Qt中,我们可以使用QTcpSocket类来创建一个基于TCP协议的Socket连接,实现客户端与服务器之间的通信。 使用CSDN来学习QtTCP编程可以帮助我们深入了解并掌握相关的知识和技能。在CSDN中,我们可以找到许多关于Qt TCP编程的教程、文章和问题解答等资源,这些资源能够帮助我们快速入门和解决实际开发中遇到的问题。 在使用Qt进行TCP编程时,我们首先需要创建一个QTcpSocket对象,然后通过connectToHost()方法连接到服务器,并使用write()方法发送数据。同时,我们还可以使用readyRead()信号和read()方法接收服务器返回的数据。 通过CSDN学习Qt TCP编程,我们可以了解Qt提供的丰富的网络通信类和方法,比如QHostAddress、QAbstractSocket、QNetworkInterface等,这些类和方法能够帮助我们更好地进行网络通信的开发和调试。 总之,通过CSDN学习Qt TCP编程可以让我们更快速地入门和掌握相关知识和技能,为我们开发网络通信应用提供了很大的帮助。同时,CSDN作为技术开发者社区,也为我们提供了和其他开发者交流和分享经验的平台。所以,利用CSDN学习Qt TCP编程是非常有价值的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值