美文网首页
TCP网络通信

TCP网络通信

作者: xqiiitan | 来源:发表于2025-05-05 14:16 被阅读0次

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();
}

相关文章

  • 你需要知道的TCP/IP

    前言 TCP/IP 协议 是网络通信的基石,TCP/IP 协议 不是只有 TCP 和 IP 协议,它是整个网络通信...

  • 史上最简单的Sockte通信--1

    Socket,是基于网络通信协议封装的一个网络通信接口,可以支持TCP或UDP通信协议。通常是应用于TCP协议,这...

  • 从输入URL到浏览器显示页面发生了什么??

    一、网络通信互联网内各网络设备间的通信都遵循TCP/IP协议,利用TCP/IP协议族进行网络通信时,会通过分层顺序...

  • TCP流嗅探和连接跟踪工具tcpick

    TCP流嗅探和连接跟踪工具tcpick 由于网络通信协议众多,TCP连接状态众多,所以TCP分析较为复杂。Kali...

  • OSI网络体系结构与TCP/IP协议模型

    TCP/IP与OSI最大的不同在于:OSI是一个理论上的网络通信模型,而TCP/IP则是实际上的网络通信标准。 O...

  • tcp网络通信

    感言:以及到了大四依然不敢说自己懂得socket这是一个功能强大用途广泛的系统调用。什么是socket:linux...

  • 网络通信TCP

    TCP:传输控制协议 稳定 相对于UDP慢一些 web服务器都使用TCP UDP:用户数据包协议 不稳定 相比较T...

  • gen_tcp详解

    该模块 提供一组基于tcp/ip协议 socket 网络通信方法。 gen_tcp:connect/3 gen_t...

  • 理解基于 TCP 的应用层通信协议

    TCP 协议示意 关于七层网络通信的基本原理,特别推荐这篇图文并茂的长文《TCP/IP笔记 - 综述》 TCP 通...

  • tcp/ip的基本知识

    一.什么是tcp/ip tcp/ip是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说tcp/ip被认为...

网友评论

      本文标题:TCP网络通信

      本文链接:https://www.haomeiwen.com/subject/ipsfijtx.html