TCP网络通信

2025-05-05  本文已影响0人  xqiiitan

1.TCP网络通信

QIODevice 基类:

QAbstractSocket

QTcpSocket、QUdpSocket

send--write()
recv--read()

监听:QTcpServer 不是IO设备。
通信:QTcpSocket

TCP连接,发数据。

server.listen(IP, port); // 1.服务器进入监听状态。
connectToHost(serverIP,serverPort) // 2.client 连接服务器
newConnection() //3.server收到信号
在槽函数中,接收连接请求accept()
conn = server.nextPendingConnection(); //保存client端的信息,用于通信。

write() //4.1 server: write向客户端发送数据
readyRead() //4.2 client: 收到信号readyRead,读数据 readAll()
write() //4.3 client: 发数据
readyRead() //4.4 server: 收到信号readyRead()--> 槽函数去读数据。

disConnectFromHost() //5. client 关闭链接
close() //5.1 client 关闭套接字,关闭的是IO设备。

2.sesrver

server.h
#ifndef SERVER_H
#define SERVER_H
#include <QWidget>
#include <QTcpServer> //network
#include <QTcpSocket>

QT_BEGIN_NAMESPACE
namespace Ui { class Server; }
QT_END_NAMESPACE

class Server : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Server *ui;
    QTcpServer* server; //监听的套接字
    QTcpSocket* conn;   //通信的套接字
};
#endif // SERVER_H
server.cpp
#include "server.h"
#include "ui_server.h"

Server::Server(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Server)
{
    ui->setupUi(this);
    ui->qIp->setText("127.0.0.1");
    ui->qPort->setText("9999");
    // init tcp Server, and listen.
    server = new QTcpServer(this);
    server->listen(QHostAddress(ui->qIp->text()), ui->qPort->text().toInt());

    // newConnection.
    connect(server, &QTcpServer::newConnection, this, [=](){
        //recvive client socket, get client infos.
        conn = server->nextPendingConnection();
        // send data
        //conn->write("abcdefg");
        ui->textEdit_recv->append("New TCP connection......");

        //保证conn 是一个有效的对象
        connect(conn, &QTcpSocket::readyRead, this, [=](){
            // recv data, and show.
            QByteArray array = conn->readAll();
            ui->textEdit_recv->append(array);
        });
    });

    //  发送按钮
    connect(ui->btn_send, &QPushButton::clicked, this, [=] (){
        QString msg = ui->textEdit_input->toPlainText();
        conn->write(msg.toUtf8().data());
        ui->textEdit_recv->append("I say:" +msg );
        ui->textEdit_input->clear();
    });
}
Server::~Server()
{
    delete ui;
}

3.client

client.h
#ifndef CLIENT_H
#define CLIENT_H

#include <QWidget>
#include <QTcpSocket>
#include <QTcpServer> //network

namespace Ui {
class Client;
}
class Client : public QWidget
{
    Q_OBJECT

public:
    explicit Client(QWidget *parent = nullptr);
    ~Client();
private:
    Ui::Client *ui;
    QTcpSocket* client;
};
#endif // CLIENT_H
client.cpp
#include "client.h"
#include "ui_client.h"

Client::Client(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);
    ui->qIp->setText("127.0.0.1");
    ui->qPort->setText("9999");
    // init tcp
    client = new QTcpSocket(this);
    // 非阻塞的链接 to server,什么时候链接好,未知。
    client->connectToHost(QHostAddress(ui->qIp->text()), ui->qPort->text().toInt());
    // receive data
    connect(client, &QTcpSocket::readyRead, this, [=](){
        // recv data, and show.
        QByteArray array = client->readAll();
        ui->textEdit_recv->append(array);
    });
    // send data
    connect(ui->btn_send, &QPushButton::clicked, this, [=] (){
        QString msg = ui->textEdit_input->toPlainText();
        client->write(msg.toUtf8().data());
        ui->textEdit_recv->append("Me Say: " + msg);
        ui->textEdit_input->clear();
    });
}
Client::~Client()
{
    delete ui;
}
main.cpp
#include "server.h"
#include "client.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Server w;
    w.setWindowTitle("TCP server");
    w.show();

    Client c;
    c.setWindowTitle("Tcp client");
    c.show();
    return a.exec();
}
上一篇 下一篇

猜你喜欢

热点阅读