QT TCP通信(client+server)

QT TCP通信(client+server)

首先在.pro文件中引入network模块

//qt项目的.pro文件中添加下行
QT       += network #添加network模块

引入头文件

#include<QTcpServer>//监听套接字,客户端就不需要了
#include<QTcpSocket>//通信套接字,服务端客户端都需要

编码

//服务端代码.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include<QTcpServer>//监听套接字
#include<QTcpSocket>//通信套接字
#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_connect_btn_clicked();
    void on_disconnect_btn_clicked();
    void newconnection();

private:

    QTcpServer *tcpserver = NULL;
    QTcpSocket *tcpsocket = NULL;
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//服务端.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QDebug>
 #pragma execution_character_set("utf-8")
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tcpserver = new QTcpServer(this);//创建QTcpServer的对象用作监听套接字;
    tcpserver->listen(QHostAddress::LocalHost,7722);//监听ip和端口;
    //如果有新的连接过来,并且连接成功,服务器会触发newConnection()信号,通过槽函数取出连接成功的scoket;
    connect(tcpserver,&QTcpServer::newConnection,this,[=]()->void{
    
        tcpsocket=tcpserver->nextPendingConnection();//获得连接对象
        QString ip = tcpsocket->peerAddress().toString(); //获取连接的IP
        quint16 port=tcpsocket->peerPort();//获取连接的 端口号
        qDebug()<<QString("[%1:%2] 客服端连接成功").arg(ip).arg(port);
        //接收到信息
        connect(tcpsocket,&QTcpSocket::readyRead,this,[=]()->void{
           qDebug()<<tcpsocket->readAll();
           tcpsocket->write("hello i am server");
        });
        //连接断开
        connect(tcpsocket,&QTcpSocket::disconnected,this,[=]()->void{
            QString ip = tcpsocket->peerAddress().toString();
            quint16 port=tcpsocket->peerPort();//获取连接的 端口号
           qDebug()<<QString("[%1:%2] 断开连接").arg(ip).arg(port);
        });
        
    });
}

MainWindow::~MainWindow()
{
    delete ui;
    tcpsocket->disconnectFromHost();
    tcpsocket->close();
    tcpsocket= NULL;
}
//客户端.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QTcpSocket>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QTcpSocket *tcpsocket = NULL;//声明套接字 客户端只有一个通信套接字
};
#endif // MAINWINDOW_H
//客户端.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tcpsocket =new  QTcpSocket(this);
    tcpsocket->connectToHost("127.0.0.1",7722);//设置IP和端口号
    tcpsocket->write("hello i am client ");
    
    connect(tcpsocket,&QTcpSocket::readyRead,this,[=]()->void{
        qDebug()<<tcpsocket->readAll();
    });
    
}

MainWindow::~MainWindow()
{
    delete ui;
}

运行截图

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值