QT -----TCP网络编程

 

1.主要流程

1.客户端

  • 创建QTcpSocket对象

  • 连接到服务器 --connectToHost()

  • 发送数据 ---write()

  • 读取数据 ---readAll()

  • 断开连接

2.服务器

  • 创建QTcpServer 对象

  • 绑定本地信息---listen(QHostAddress::Any,端口)

  • 等待客户端连接---newConnection()

  • 读取数据

  • 发送数据

  • 断开连接

2.头文件

  • 客户端:#include < QTcpSocket >

  • 服务器:#include < QTcpServer >

  • 必须要在pro文件加上-----QT += core gui network

3.代码

1.客户端

  • widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    ​
    #include <QWidget>
    #include <QtNetwork/QTcpSocket>
    #include <QKeyEvent>
    ​
    namespace Ui {
    class Widget;
    }
    ​
    class Widget : public QWidget
    {
    Q_OBJECT
    ​
    ​
    private:
    QTcpSocket *client;
    QString *message;
    ​
    void keyPressEvent(QKeyEvent *event);
    public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    ​
    private:
    Ui::Widget *ui;
    };
    ​
    #endif // WIDGET_H
    ​
     
  • widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QTextEdit>
    Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
    {
    ui->setupUi(this);
    ​
    client = new QTcpSocket(this);
    ​
    ui->Button_send->setEnabled(false);
    ​
    /* 连接服务器 */
    connect(ui->Button_connection,&QPushButton::released,this,
    [=]()
    {
    client->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_d->text().toInt());
    });
    /* 连接成功 */
    connect(client,&QTcpSocket::connected,this,
    [&]()
    {
    ui->Button_send->setEnabled(true);
    ui->label_prompt->setText("已连接");
    ui->textEdit_receive->append("连接成功……");
    });
    ​
    /* 发送到服务器 */
    connect(ui->Button_send,&QPushButton::released,this,
    [&]()
    {
    QString data = ui->textEdit_edit->toPlainText();
    if(data.length() > ) //如果输入框不为空才可以发送
    {
    client->write(data.toUtf8());
    QString data1 = "已发送:"+data;
    ui->textEdit_receive->append(data1);
    }
    else {
    ui->textEdit_receive->append("输入信息");
    }
    ​
    });
    ​
    /* 接收信息 */
    connect(client,&QTcpSocket::readyRead,this,
    [&]()
    {
    QString msg = "收到:" + client->readAll();
    ui->textEdit_receive->append(msg);
    });
    ​
    ​
    /* 断开连接 */
    connect(ui->Button_disconnect,&QPushButton::released,this,
    [=]()
    {
    client->disconnectFromHost();
    ui->Button_send->setEnabled(false);
    });
    /* 断开连接 */
    connect(client,&QTcpSocket::disconnected,this,
    [&]()
    {
    ui->label_prompt->setText("未连接……");
    ui->textEdit_receive->append("断开连接……");
    });
    ​
    ​
    }
    ​
    /* 键盘事件:捕获按下回车键发送---这一部分可选择不要 */
    void Widget::keyPressEvent(QKeyEvent *event)
    {
    int key = event->key();
    if(key == Qt::Key_Enter)
    {
    QString data = ui->textEdit_edit->toPlainText();
    if(data.length() > )
    {
    client->write(data.toUtf8());
    QString data1 = "已发送:"+data;
    ui->textEdit_receive->append(data1);
    }
    else {
    ui->textEdit_receive->append("输入信息");
    }
    ​
    }
    }
    Widget::~Widget()
    {
    delete ui;
    }
    ​
     

2.服务器

  • widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    ​
    #include <QWidget>
    #include <QtNetwork/QTcpServer>
    #include <QtNetwork/QTcpSocket>
    #include <QKeyEvent>
    ​
    namespace Ui {
    class Widget;
    }
    ​
    class Widget : public QWidget
    {
    Q_OBJECT
    ​
    public:
    QTcpServer *server;
    QTcpSocket *socket;
    ​
    void new_client();
    void send_data();
    void read_data();
    void disconnect();
    ​
    void keyPressEvent(QKeyEvent *event); //重写键盘事件虚函数,如果不要键盘发 //送可选择删掉
    public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    ​
    private:
    Ui::Widget *ui;
    };
    ​
    #endif // WIDGET_H
    ​
  • widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug>
    ​
    Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
    {
    ui->setupUi(this);
    ​
    ui->Button_send->setEnabled(false);
    server = new QTcpServer(this);
    ​
    /* 绑定绑定信息 */
    server->listen(QHostAddress::Any,ui->lineEdit_d->text().toInt());
    ​
    /* 等待客户端连接 */
    connect(server,&QTcpServer::newConnection,this,&Widget::new_client);
    ​
    /* 发送信息 */
    connect(ui->Button_send,&QPushButton::released,this,&Widget::send_data);
    ​
    ​
    }
    ​
    /* 等待连接 */
    void Widget::new_client()
    {
    qDebug() << "新客户连接";
    ui->label_prompt->setText("已连接");
    ui->textEdit_log->append("连接成功");
    ui->Button_send->setEnabled(true);
    socket = server->nextPendingConnection();
    connect(socket,&QTcpSocket::readyRead,this,&Widget::read_data);
    connect(ui->Button_disconnect,&QPushButton::released,socket,&QTcpSocket::disconnectFromHost);
    connect(socket,&QTcpSocket::disconnected,this,
    [&]()
    {
    ui->textEdit_log->append("断开连接");
    });
    }
    /* 发送信息 */
    void Widget::send_data()
    {
    QString data = ui->textEdit_edit->toPlainText();
    if(data.length() > ) //如果输入栏不为空才可以发送
    {
    socket->write(data.toUtf8());
    QString data1 = "已发送:" + data;
    ui->textEdit_log->append(data1);
    }
    else {
    ui->textEdit_log->append("输入信息");
    }
    }
    ​
    /* 接收信息 */
    void Widget::read_data()
    {
    // QTcpSocket *obj = (QTcpSocket*)sender();
    QString msg = "收到:" + socket->readAll();
    ui->textEdit_log->append(msg);
    }
    ​
    /* 断开连接 */
    void Widget::disconnect()
    {
    ui->textEdit_log->append("断开连接");
    ui->Button_send->setEnabled(false);
    }
    ​
    /* 回车键发送 ----- 可选择不要 */
    void Widget::keyPressEvent(QKeyEvent *event)
    {
    int key = event->key();
    if(key == Qt::Key_Enter)
    {
    QString data = ui->textEdit_edit->toPlainText();
    if(data.length() > ) //如果输入栏不为空才可以发送
    {
    qDebug() << data.length();
    socket->write(data.toUtf8());
    QString data1 = "已发送:" + data;
    ui->textEdit_log->append(data1);
    }
    else {
    ui->textEdit_log->append("输入信息");
    }
    }
    }
    ​
    Widget::~Widget()
    {
    delete ui;
    }​

4.布局

  • 客户端
  • 服务器

QT--TCP网络编程(客户端/服务器)的更多相关文章

  1. QT TCP网络编程

    首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.相比而言UDP,就是开放式.无连接.不可靠的传输层 ...

  2. TCP网络编程-----客户端请求连接服务器、向服务器发数据、从服务器接收数据、关闭连接

    SOCKET m_sockClient; unsigned short portNum; ------------------------------------------------------- ...

  3. Ubuntu上Qt+Tcp网络编程之简单聊天对话框

    首先看一下实现结果: >>功能: (1)服务器和客户端之间进行聊天通信: (2)一个服务器可同时给多个客户端发送消息:(全部连接时)   也可以只给特定的客户端发送消息:(连接特定IP) ...

  4. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  5. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  6. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  7. TCP网络编程

    TCP网络编程  与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /**     * @param args     * @th ...

  8. 简述TCP网络编程本质

    基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ...

  9. Java - TCP网络编程

    Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...

随机推荐

  1. 更好一点的:Vue 利用指令实现禁止反复发送请求

    理论上可以用于任何元素,生效时会在元素上出现一个同大小的灰色蒙层(button元素会该表原生的disabled属性). /** * 当元素触发发起请求后,当发起的请求中最后一个请求的结果返回(不关心返 ...

  2. SpringBoot:带你认认真真梳理一遍自动装配原理

    前言 Spring翻译为中文是“春天”,的确,在某段时间内,它给Java开发人员带来过春天,但是随着我们项目规模的扩大,Spring需要配置的地方就越来越多,夸张点说,“配置两小时,Coding五分钟 ...

  3. 《软件安装》centos 安装 mysql

    上期问题回顾 全球 IPv4 地址正式耗尽,IPv4地址大约42.9亿,按照理论来说,每一个联网的设备都需要IP地址,而现在全球联网设备远远不止42.9亿,那么,这么多设备是怎么处理联网的问题呢? 先 ...

  4. 关于新浪和腾讯短网址API接口的调用

    最新新浪t.cn短网址和腾讯url.cn短网址生成api接口,快速生成t.cn及url.cn超短链接,接口都可以正常调用,觉得不错可以收藏一下. 新浪短网址api接口:1. http://yldwz. ...

  5. 【Android - 自定义View】之自定义九宫格手势解锁控件

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 LockView ,继承自View类: (2)这个自定义View实现了应用中常见的九宫格手势解锁功能,可以用于保证应用安全: ( ...

  6. Beautifulsoup模块基础详解

    Beautifulsoup模块 官方中文文档 Beautifulsoup官方中文文档 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的 ...

  7. Spring MVC使用ModelAndView进行重定向

    1.Servlet重定向forward与redirect: 使用servlet重定向有两种方式,一种是forward,另一种就是redirect.forward是服务器内部重定向,客户端并不知道服务器 ...

  8. 学习WebFlux时常见的问题

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾一下上篇我对WebFlux的入门,如果没读过 ...

  9. ASP.NET Core SignalR :学习消息通讯,实现一个消息通知

    什么是 SignalR 目前我用业余时间正在做一个博客系统,其中有个功能就是评论通知,就是假如A用户评论B用户的时候,如果B用户首页处于打开状态,那么就会提示B用户有未读消息.暂时用SignalR来实 ...

  10. 如何使用modelarts训练海量数据

    在modelarts上使用notebook上使用evs空间默认大小是5G,能满足大部分文本和图片训练模型的需求.如果训练数据稍微超过这个限额,可以适当的扩增下空间.但如果训练对象是视频,或是实际生成过 ...