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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Vue项目实战05:18n实现多语言自动切换-浏览器语言设置「建议收藏」

    Vue项目实战05:18n实现多语言自动切换-浏览器语言设置「建议收藏」什么是vue-i18ni18n是Internationalization这个英文的简写,即国际化的意思,vue-i18n是一款针对于vue开发的国际化插件,让项目支持多语言切换,以适应不同地区用户的需求。安装vue-i18n直接在项目中执行安装命令:npminstallvue-i18n–save​全局引入vue-i18n在项目中引入vue-i18n,实例化vue-i18n将需要加载的语言包通过require导入,这里看个人需求我只需要中英日文,所以引入zh-CN.js和en-US.j

    2022年6月4日
    34
  • mybatis-plus超详细讲解[通俗易懂]

    mybatis-plus超详细讲解[通俗易懂]mybatis-puls超详细讲解本文笔记都是观看狂神老师视频手敲的,敲完的时候发现一件挺奔溃的事,视频地址:https://www.bilibili.com/video/BV17E411N7KN视频地址这个老师讲课真的很好,学java后端的都可以去看一下,从基础到架构很详细,推荐给大家https://space.bilibili.com/95256449/狂神说最近做项目听到老师讲到使用…

    2022年5月5日
    43
  • 5款App帮你创建时间轴

    做一个时间轴有很多理由。你可能希望创建一个关于如何展开项目和运作公司的时序图,追踪家族史,或者记录你职业生涯的进步轨迹。但不管是什么原因,你都需要一个合适的工具来让这个时间轴易于使用。你不能只是用一个电子表格或者文本文档来创建一个有用的互动工具。相反,你需要合适的软件来完成这项工作。我发现了5款应用可以很好地创建时间轴,不管是针对什么用途。有些是移动应…

    2022年4月7日
    86
  • SQL用了Union后的排序问题

    SQL用了Union后的排序问题

    2021年10月15日
    290
  • 修改asmx样式

    修改asmx样式今天看到一张图,asmx的WebService。长这样:当时就感觉有意思,这个页面风格和我们平时的不一样,我们平时的WebService长这样:我们如果在WebMetohd上面加注释,即[WebMethod(Description=”注释”)],那么长这样:那么问题就来了,第一张图里面的样式是如何实现的呢?在浏览器上进入调试模式观察,可以发现它的html和我们的有点不…

    2022年4月29日
    40
  • idea配置tomcat服务器运行项目_idea添加tomcat服务器

    idea配置tomcat服务器运行项目_idea添加tomcat服务器需求背景      从Eclipse转IDEA后面对的第一个问题,就是要为IDEA配置tomcat服务,否则不可用。那么,功能需求      那么,该如何配置呢?1、点击“EditConfigurations”进入tomcat服务编辑页面。如下图所示:2、点击…

    2022年10月18日
    2

发表回复

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

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