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. Slickflow.Graph 开源工作流引擎快速入门之四: 图形编码建模工具使用手册

    前言: 业务人员绘制流程时,通常使用图形GUI界面交互操作来完成,然而对于需要频繁操作或者管理较多流程的系统管理用户,就需要一款辅助工具,来帮助他们快速完成流程的创建和编辑更新.Slickflow.G ...

  2. 6. 彤哥说netty系列之Java NIO核心组件之Buffer

    --日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第六篇. 简介 上一章我们一起学习了Java NIO的核心组件Channel,它可以看作是实体与实体之间的连接,而且需要与Buffer交 ...

  3. Java 浅拷贝、深拷贝,你知多少?

    这是今天我们在技术群里面讨论的一个知识点,讨论的相当激烈,由于对这一块使用的比较少,所以对这一块多少有些盲区.这篇文章总结了所讨论的内容,希望这篇文章对你有所帮助. 在 Java 开发中,对象拷贝或者 ...

  4. yum更换国内源、yum下载rpm包、源码包安装 使用介绍

    第5周第4次课(4月19日) 课程内容: 7.6 yum更换国内源7.7 yum下载rpm包7.8/7.9 源码包安装 7.6 yum更换国内源 当yum仓库的软件不好用时,例如很多yum源都是国外的 ...

  5. C语言l博客作业01

    2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样?(2分) 计算机科学与技术是国家一级学科,下设信息安全,软件工程,计算机软件与理论等专业,主要培养符合教育部门实际需要的计算机教学及应用管理 ...

  6. ThinkPHP5——模型关联(多对多关联)

    关联定义 多对多关联不像一对一和一对多关联,它还要多建一个中间表用来处理多对多的关联,例如: #城市 create table city ( c_id int primary key AUTO_INC ...

  7. Apple 应用内支付心得

    http://tank2308635.iteye.com/blog/1238687Apple 应用内支付 首先简要说一下IAP 流程 简要步骤说明: 用户进入购买虚拟物品页面,App从后台服务器获取产 ...

  8. emmet的html和css使用技巧大全

    emmet html使用技巧大全 ! 初始化 >:后代+:兄弟^:向上*:乘法$:数字():分组#:id命名.:类命名 一.id,类命名p#infop.infoa[href=#] 二.后代:di ...

  9. python光标图片获取

    # -*- coding:utf-8 -*- import win32api import win32gui,win32ui import time while True : time.sleep(1 ...

  10. Python爬虫技术:爬虫时如何知道是否代理ip伪装成功?

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. python爬虫时如何知道是否代理ip伪装成功: 有时候我们的爬虫程序添加了 ...