使用QT的网络套接字需要.pro文件中加入一句:

QT += network

一、客户端

1、客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步:

(1)创建QTcpSocket套接字对象

socket = new QTcpSocket();

(2)使用这个对象连接服务器

socket->connectToHost(IP, port);

(3)使用write函数向服务器发送数据

socket->write(data);

(4)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据

  1. 1
    QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
  2. 2
  3. 3
    void MainWindow::socket_Read_Data()
  4. 4
    {
  5. 5
    QByteArray buffer;
  6. 6
    //读取缓冲区数据
  7. 7
    buffer = socket->readAll();
  8. 8
    }

(5)断开与服务器的连接(关于close()和disconnectFromHost()的区别,可以按F1看帮助)

socket->disconnectFromHost();

2、以下是客户端的例程

首先是mainwindow.h文件:

  1. 1
    //mainwindow.h
  2. 2
    #ifndef MAINWINDOW_H
  3. 3
    #define MAINWINDOW_H
  4. 4
  5. 5
    #include <QMainWindow>
  6. 6
    #include <QTcpSocket>
  7. 7
  8. 8
    namespace Ui {
  9. 9
    class MainWindow;
  10. 10
    }
  11. 11
  12. 15

QT实现TCP通信_QT

然后是mainwindow.cpp文件:

  1. 1
    //mainwindow.cpp
  2. 2
    #include "mainwindow.h"
  3. 3
    #include "ui_mainwindow.h"
  4. 4
  5. 5
    MainWindow::MainWindow(QWidget *parent) :
  6. 6
    QMainWindow(parent),
  7. 7
    ui(new Ui::MainWindow)
  8. 8
    {
  9. 9
    ui->setupUi(this);
  10. 10
  11. 11
    socket = new QTcpSocket();
  12. 15
    QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);

QT实现TCP通信_#include_02

最后是ui的设计:

QT实现TCP通信_QT_03

二、服务器

1、服务器除了使用到了QTcpSocket类,还需要用到QTcpSever类。即便如此,也只是比客户端复杂一点点,用到了6个步骤:

(1)创建QTcpSever对象

server = new QTcpServer();

(2)侦听一个端口,使得客户端可以使用这个端口访问服务器

server->listen(QHostAddress::Any, port);

(3)当服务器被客户端访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问

  1. 1
    connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);
  2. 2
  3. 3
    void MainWindow::server_New_Connect()
  4. 4
    {
  5. 5
    //获取客户端连接
  6. 6
    socket = server->nextPendingConnection();
  7. 7
    }

(4)使用socket的write函数向客户端发送数据

socket->write(data);

(5)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据

  1. 1
    QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
  2. 2
  3. 3
    void MainWindow::socket_Read_Data()
  4. 4
    {
  5. 5
    QByteArray buffer;
  6. 6
    //读取缓冲区数据
  7. 7
    buffer = socket->readAll();
  8. 8
    }

(6)取消侦听

server->close();

2、以下是服务器的例程

首先是mainwindow.h文件:

  1. 1
    //mainwindow.h
  2. 2
    #ifndef MAINWINDOW_H
  3. 3
    #define MAINWINDOW_H
  4. 4
  5. 5
    #include <QMainWindow>
  6. 6
    #include <QTcpServer>
  7. 7
    #include <QTcpSocket>
  8. 8
  9. 9
    namespace Ui {
  10. 10
    class MainWindow;
  11. 11
    }
  12. 15
    Q_OBJECT

QT实现TCP通信_客户端_04

然后是mainwindow.cpp文件:

  1. 1
    #include "mainwindow.h"
  2. 2
    #include "ui_mainwindow.h"
  3. 3
  4. 4
    MainWindow::MainWindow(QWidget *parent) :
  5. 5
    QMainWindow(parent),
  6. 6
    ui(new Ui::MainWindow)
  7. 7
    {
  8. 8
    ui->setupUi(this);
  9. 9
  10. 10
    ui->lineEdit_Port->setText("8765");
  11. 11
    ui->pushButton_Send->setEnabled(false);
  12. 15
    //连接信号槽

QT实现TCP通信_服务器_05

最后是ui的设计:

QT实现TCP通信_QT_06

三、运行结果

QT实现TCP通信_客户端_07

以上是根据这几天学习总结出的基于QT5的TCP通信的简单实现,如有错误希望能指出,欢迎各位多多交流!