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


相关推荐

  • java与python那个更好_java和python哪个更好用?

    java与python那个更好_java和python哪个更好用?互联网上的许多文章都举例论证了Python和Java之间的比较。但是没有人给出“java和python哪个更好用?”的明确理由。我们都知道,如今Python正在与几乎每种编程语言竞争。甚至它还在与世界上最强大的编程语言-Java竞争,Java是创建桌面应用程序的最佳编程语言之一。同时它也用于数据科学领域。因此,这两种编程语言在各个行业中都在相互竞争。在进行比较之前,让我们看一下这两种语言的概述。…

    2022年7月8日
    18
  • lan8742a_常用以太网PHY芯片DM9161AEP、RTL8201、DP83848CVV、LAN8720A、LAN8742A「建议收藏」

    lan8742a_常用以太网PHY芯片DM9161AEP、RTL8201、DP83848CVV、LAN8720A、LAN8742A「建议收藏」常用的PHY芯片有DM9161AEP、RTL8201、DP83848CVV、LAN8720A、LAN8742A…DM9161AEP、DP83848CVV支持RMII、MII接口,而RTL8201只支持MII接口。拿DM9161AEP举例,可以支持8根通信线(TXD0/TXD1/TXD2/TXD3/RXD0/RXD1/RXD2/RXD3)的MII接口,也可以支持4根通信线(TXD0/TXD1/R…

    2022年6月17日
    75
  • 一、智能车舵机控制

    一、智能车舵机控制前言:本文章主要是近期有关舵机知识的总结,将分别从舵机的控制原理,控制流程和代码实现流程几个方面作简要介绍,由于时间紧急,难免有疏漏错误之处,欢迎留言指正,QQ:2046890259一、多级的控制原理:我们本次智能车使用的舵机是通过PWM进行控制。而PWM几个重要的参数就是最大值,最小值和占空比。其中占空比决定了舵机的旋转角度,如下图所示:不同的占空比控制不同的角度。而我们的目的就是通过…

    2022年6月20日
    37
  • 关于tomcat闪退的问题的解决办法[通俗易懂]

    关于tomcat闪退的问题的解决办法[通俗易懂]无论是从目录中双击startup.bat,还是利用cmd命令又或者利用shell命令启动tomcat,若出现闪退,均归为此问题.解决办法:先检查是否有8080端口被占用,绝大多数情况都是这个原因.windows打开cmd,输入命令netstat-ano|findstr8080,找到所有占用8080端口的进程,记住它们的pid序列号(最右边的数字).继续输入命令taskkill[\f]\pid要删除的pid号,如果不能结束进程,再输入\f在对应未知.输入命令netst

    2022年5月23日
    30
  • cx_Oracle读取Oracle数据库中文乱码问题解决

    cx_Oracle读取Oracle数据库中文乱码问题解决

    2021年11月21日
    44
  • 高手解决DISK BOOT FAILURE,INSERT SYSTEM DISK AND PRESS ENTER

    高手解决DISK BOOT FAILURE,INSERT SYSTEM DISK AND PRESS ENTER1、首先要先确定你加电启动的时候有没有认出你的硬盘。这点在bios里可查。如果开机「滴」的一声短声,证明开机自检没问题(排除硬件问题,但不包括硬盘没有识别)。此时按del键进入bios,看你的硬盘有没

    2022年7月4日
    22

发表回复

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

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