QTcpSocket学习

QTcpSocket学习一、涉及到的函数监听:tcpServer->listen(QHostAddress::LocalHost,6666)错误信息:tcpServer->errorString()新连接信号:connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage()))设置输出流:QByteArrayblock…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、涉及到的函数

监听:tcpServer->listen(QHostAddress::LocalHost, 6666)

错误信息:tcpServer->errorString()

新连接信号:connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendMessage()))

设置输出流:QByteArray block; QDataStream out(&block, QIODevice::WriteOnly);

等待数据发送完毕后删除:clientConnection->disconnectFromHost();

连接到主机:tcpSocket->connectToHost(ui->hostLineEdit->text(), ui->portLineEdit->text().toInt());

 

二、函数源码

tcpServer.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tcpServer = new QTcpServer(this);
    //使用了IPv4的本地主机地址,等价于QHostAddress("127.0.0.1")
    if(!tcpServer->listen(QHostAddress::LocalHost, 6666)) {
        qDebug()<<tcpServer->errorString();
        close();
    }
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendMessage()));
}

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

void MainWindow::sendMessage()
{
    //用于暂存要发送的数据
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);

    //设置数据流的版本,客户端和服务器端使用的版本要相同
    out.setVersion(QDataStream::Qt_4_0);
    out<<(quint16)0;                            //用两个字节表示数据长度
    out<<tr("hello TCP!!!");
    out.device()->seek(0);
    out<<(quint16)(block.size() - sizeof(quint16));     //总数据大小减去数据块开头两个字节大小

    //获取已建立的连接的套接字
    QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
    connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));       //失去连接后删除
    clientConnection->write(block);
    clientConnection->disconnectFromHost();         //等待数据发送完毕后关闭

    //发送数据成功后,显示提示
    ui->label->setText("send message successful!!!");
}

client.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tcpSocket = new QTcpSocket(this);
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(displayError(QAbstractSocket::SocketError)));
}

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

void MainWindow::newConnect()
{
    //初始化数据大小信系为0
    blockSize = 0;

    //取消已有的连接
    tcpSocket->abort();
    tcpSocket->connectToHost(ui->hostLineEdit->text(), ui->portLineEdit->text().toInt());
}

void MainWindow::readMessage()
{
    QDataStream in(tcpSocket);
    //设置数据流版本,这里要和服务器端相同
    in.setVersion(QDataStream::Qt_4_6);

    //如果是刚开始接收数据
    if(blockSize == 0) {
        //判断接收的数据是否大于两个字节,也就是文件的大小信息所占的空间
        //如果是则保存到blockSize变量中,否则直接返回,继续接收数据
        if(tcpSocket->bytesAvailable()<(int)sizeof(quint16)) return;
        in>>blockSize;
    }
    //如果没有得到全部的数据,则返回,继续接收数据
    if(tcpSocket->bytesAvailable() < blockSize) return;
    //将接收到的数据存放到变量中
    in>>message;
    //显示接收到的数据
    qDebug()<<message;
    ui->messageLabel->setText(message);
}

void MainWindow::displayError(QAbstractSocket::SocketError)
{
    qDebug()<<tcpSocket->errorString();
}

void MainWindow::on_connectButton_clicked()
{
    newConnect();
}

 

三、函数说明

server有一个信号槽,当建立了新的连接就发送一个字符串。

client则需要对服务器端建立连接,这时服务器不是发送了字符串嘛。就会有readyRead信号触发,然后从流中读取数据。

 

转载于:https://www.cnblogs.com/ch122633/p/8287219.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197506.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sql server2008 r2 密钥

    sql server2008 r2 密钥sqlserver2008r2密钥Developer:PTTFM-X467G-P7RH2-3Q6CG-4DMYBEnterprise:JD8Y6-HQG69-P9H84-XDTPG-34MB

    2022年7月4日
    25
  • 消息总线(MQ)知多少

    消息总线(MQ)知多少1 什么时候用 MQ 1 1MQ 的基本概念 消息总线 MessageQueue MQ 是一种跨进程的通信机制 用于在上下游之间传递消息 MQ 是一种常见的上下游 逻辑解耦 物理解耦 的消息通信服务 消息发送上游只需要依赖 MQ 逻辑上和物理上都不用依赖其他服务 1 2MQ 的使用场景场景一 数据驱动的任务依赖 有些任务之间有一定的依赖关系 比如 task3 需要使用 task2 的输出作为输入 tas

    2025年9月27日
    2
  • 搭建CICD平台

    搭建CICD平台**搭建CICD平台**1、主机准备。2、安装前预配置。准备相应的系统配置与软件依赖。3、执行安装。4、安装后配置。添加相应的组件以及修改配置。如导入模板等。一、主机准备Centos7.2配置:内存大于4G。(其中Jenkins占1.5G、Gitlab占2G)8080、10080、10022、50000端口未使用二、安装前预配置1、添加阿里yum源(如果已配置了…

    2022年6月12日
    49
  • java 堆栈的声明_Java 堆栈[通俗易懂]

    java 堆栈的声明_Java 堆栈[通俗易懂]Java堆栈堆栈是一种线性数据结构,用于存储对象的集合。它基于先进先出(LIFO)。Java集合框架提供了许多接口和类来存储对象的集合。其中之一是Stack类,它提供了不同的操作,例如推,弹出,搜索等。在本节中,我们将讨论JavaStack类,其方法和实现在Java中的堆栈数据结构程序。但是在转到JavaStack类之前,请先快速了解堆栈的工作原理。堆栈数据结构具有两个最重要的操作,分别…

    2022年7月7日
    22
  • 分页的sql语句_如何实现分页效果

    分页的sql语句_如何实现分页效果下文将为您介绍三种SQL分页语句写法,如果您也遇到过类似的问题,不妨一看,相信对您会有所启迪。SQL分页操作是经常会遇到的,下面就将为您介绍三种SQL分页语句,供您参考,希望对您学习SQL分页能够有所帮助。方法一(适用于SQLServer2000/2005)SELECTTOP页大小* FROMtable1 WHEREidNOTIN

    2022年9月21日
    2
  • c语言 xff占几个字节,xff

    c语言 xff占几个字节,xff知识点:《xff》收集:充腾谑编辑:百合仙子本知识点包括:1、在计算机中,“a\xff”在内存中占用多少字节数?为什…2、C语言中printf(“%d\n”,strlen(“\t\”\065\xff\n”));…3、问个问题,printf(“%d”,strlen(“\t\”\065\xff\n”)…4、已知ch是字符型变量,下面正确的赋值语句是。A.ch…5、c程里…

    2022年6月15日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号