QT中TCP的学习

文章目录

qt中TCP的实现

  • 学习视频

  • QT中可以通过TCP协议让服务器和客户端之间行通信。服务器和客户端的具体流程
    在这里插入图片描述

  • 下方的信号都是系统提供的,我们只需要写相应的槽函数

A、服务器:

  1. 创建QTcpServer对象
  2. 启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号)
  3. 当有客户端链接时候会发送newConnection()信号,触发自定义槽函数接受链接(使用nextPendingConnection() 与客户端建立连接,得到一个与客户端通信的套接字QTcpSocket)
  4. QTcpsocket发送数据用成员方法write
  5. 读数据当客户端有数据来,QTcpSocket对象就会发送readyRead()信号,触发自定义槽函数读取数据

B、客户端 :

  1. 创建QTcpSocket对象
  2. 链接服务器connectToHost(QHostAddress("ip"),端口号)
  3. QTcpsocket发送数据用成员方法write
  4. 读数据当对方有数据来,QTcpSocket对象就会发送readyRead()信号,触发自定义槽函数读取数据

直接上源码

  • 此代码在vs2017环境下写的
  • 会有详细注释,仔细阅读代码

先添加network模块
在这里插入图片描述
测试效果:
在这里插入图片描述
textSever.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_textSever.h"
#include <QTcpServer.h>
#include <QTcpSocket.h>

class textSever : public QMainWindow
{
    Q_OBJECT

public:
    textSever(QWidget *parent = nullptr);
    ~textSever();

signals:
	
public slots:
	void new_connect();// 有新的连接
	void rev_mag();// 接收发送过来的消息
	void send_mag();// 发送消息

private:
    Ui::textSeverClass ui;

	QTcpServer* severSocket;// 监听套接字
	QTcpSocket* clientSocket;// 通信套接字
};

textSever.cpp

#include "textSever.h"



textSever::textSever(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	// 初始化 ui
	ui.sIP->setText("127.0.0.1");
	ui.sPort->setText("9999");

	// 初始化套接字
	severSocket = new QTcpServer(this);
	// 监听套接字  监听本地
	severSocket->listen(QHostAddress(ui.sIP->text()), ui.sPort->text().toInt());

	// 当有新的连接的时候会触发 newConnection 信号
	connect(severSocket, &QTcpServer::newConnection, this, &textSever::new_connect);
}

textSever::~textSever()
{}

void textSever::new_connect() {
	// 有点像客户端的套接字 accept
	// 连接客户端
	clientSocket = severSocket->nextPendingConnection();

	// ui.record->append("有新的连接。。。。。");在vs中会有乱码
	ui.record->append(QString::fromLocal8Bit("有新的连接。。。。。"));

	// 当客户端有消息发送过来的时候,就会触发 readyRead 信号
	connect(clientSocket, &QTcpSocket::readyRead, this, &textSever::rev_mag);

	// 点击按钮,向客户端发送数据
	connect(ui.sendBtn, &QPushButton::clicked, this, &textSever::send_mag);
}

void textSever::rev_mag()
{
	// 接收数据
	QByteArray array = clientSocket->readAll();
	ui.record->append(array);
}

void textSever::send_mag()
{
	//发送数据
	clientSocket->write(ui.msg->toPlainText().toUtf8().data());
	ui.record->append("Me Say: " + ui.msg->toPlainText());

	// 清除发送框的消息
	ui.msg->clear();
}

textClient.h

#pragma once

#include <QMainWindow>
#include "ui_textClient.h"
#include <QTcpSocket.h>
#include <QHostAddress.h>

class textClient : public QMainWindow
{
	Q_OBJECT

public:
	textClient(QWidget *parent = nullptr);
	~textClient();

signals:

public slots:
	void rev_mag();// 接收发送过来的消息
	void send_mag();// 发送消息

private:
	Ui::textClientClass ui;
	QTcpSocket* clientSocket;
};

textClient.cpp

#include "textClient.h"

textClient::textClient(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	//初始化
	clientSocket = new QTcpSocket(this);

	// 初始化 ui
	ui.sIP->setText("127.0.0.1");
	ui.sPort->setText("9999");
	
	//连接服务器  这个是非阻塞方式,连接不上也不管
	clientSocket->connectToHost(QHostAddress(ui.sIP->text()), ui.sPort->text().toInt());

	// 接收数据
	connect(clientSocket, &QTcpSocket::readyRead, this, &textClient::rev_mag);

	// 发送数据
	connect(ui.sendBtn, &QPushButton::clicked, this, &textClient::send_mag);


}

textClient::~textClient()
{}

void textClient::rev_mag()
{
	QByteArray array = clientSocket->readAll();
	ui.record->append(array);
}

void textClient::send_mag()
{
	clientSocket->write(ui.msg->toPlainText().toUtf8().data());
	ui.record->append("my say :" + ui.msg->toPlainText());

	ui.msg->clear();
}

main.cpp

#include "textSever.h"
#include "textClient.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	//对于按钮文字显示不全的解决方法,必须放在main中的第一行
	QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication a(argc, argv);

    textSever w;
	w.setWindowTitle(QString::fromLocal8Bit("服务器"));
    w.show();
	
	textClient c;
	c.setWindowTitle(QString::fromLocal8Bit("客户端"));
	c.show();

    return a.exec();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CSDN是一个专门面向程序员的技术社区,提供了丰富的技术文章、视频教程和在线问答等服务,方便程序员们学习和交流。而Qt是一种跨平台的桌面应用程序开发框架,它提供了丰富的工具和类库,使得开发者可以更加便捷地开发出美观、功能强大的应用程序。TCP则是一种常见的网络传输协议,它在网络通信起到了重要的作用。 在CSDN上,有很多关于QtTCP的相关文章和教程。程序员们可以通过这些资源来学习和了解如何使用Qt框架开发自己的应用程序,并且通过TCP协议实现网络通信。这些教程和文章通常包括了基本的Qt框架介绍、TCP协议的原理和使用方法等内容,可以帮助程序员们快速入门并掌握相关的技术。 使用Qt开发应用程序时,通常需要涉及到用户界面的设计和实现、数据的处理和存储、以及与后端服务器的通信等功能。而TCP协议则是一种可靠的网络传输协议,它能够保证数据的可靠传输和顺序性,因此在网络通信被广泛应用。程序员们可以通过学习如何使用Qt的网络类库,建立TCP连接并进行数据的传输。 总的来说,CSDN上关于QtTCP的教程和文章提供了很好的学习资源,帮助程序员们学习和掌握如何使用Qt框架开发自己的应用程序,并通过TCP协议实现网络通信。这些教程和文章的存在为程序员们提供了更多的学习和交流的机会,使得开发者们能够更加便捷地使用这些技术来实现自己的应用程序和项目。 ### 回答2: CSDN是一个开发者社区,提供了丰富的技术文章、博客、论坛以及资源下载等服务。Qt是一个跨平台的应用程序开发框架,它提供了丰富的GUI和网络编程功能,能够帮助开发者快速地构建出高质量的应用程序。TCP是一种网络传输协议,它提供了可靠的、面向连接的数据传输方式。在Qt,我们可以使用Qt Network模块来进行TCP网络编程。 Qt提供了一个QTcpSocket类,可以在客户端和服务器端进行TCP连接。我们可以通过调用QTcpSocket类的相关方法来实现数据的发送和接收。例如,我们可以使用QTcpSocket的connectToHost()方法来与服务器建立连接,使用write()方法发送数据,使用readyRead()信号和read()方法来接收数据。同时,QTcpSocket还提供了一些其他方法,如isReadable()来判断是否有数据可读,isWritable()来判断是否能够写入数据等。 除了QTcpSocket类,Qt还提供了QTcpServer类,用于实现服务器端的TCP监听和连接管理。我们可以使用QTcpServer的listen()方法来监听指定的端口,通过newConnection()信号和nextPendingConnection()方法来接受客户端的连接请求,然后使用返回的QTcpSocket对象进行数据的通信。 在CSDN上,有很多关于Qt TCP网络编程的教程和示例代码,可以帮助开发者快速入门和理解相关概念。通过学习这些资源,我们可以掌握在Qt进行TCP通信的基本方法和技巧,从而能够使用Qt构建出功能强大的网络应用程序。 ### 回答3: CSDN是一个面向IT技术开发人员的社区平台,其有丰富的技术资源和开发者分享的经验,而Qt是一款跨平台的C++应用程序开发框架,可用于开发图形界面及网络通信等应用。 TCP是传输控制协议(Transmission Control Protocol)的简称,它是一种面向连接的、可靠的、基于字节流的传输层协议。在Qt,我们可以使用QTcpSocket类来创建一个基于TCP协议的Socket连接,实现客户端与服务器之间的通信。 使用CSDN来学习QtTCP编程可以帮助我们深入了解并掌握相关的知识和技能。在CSDN,我们可以找到许多关于Qt TCP编程的教程、文章和问题解答等资源,这些资源能够帮助我们快速入门和解决实际开发遇到的问题。 在使用Qt进行TCP编程时,我们首先需要创建一个QTcpSocket对象,然后通过connectToHost()方法连接到服务器,并使用write()方法发送数据。同时,我们还可以使用readyRead()信号和read()方法接收服务器返回的数据。 通过CSDN学习Qt TCP编程,我们可以了解到Qt提供的丰富的网络通信类和方法,比如QHostAddress、QAbstractSocket、QNetworkInterface等,这些类和方法能够帮助我们更好地进行网络通信的开发和调试。 总之,通过CSDN学习Qt TCP编程可以让我们更快速地入门和掌握相关知识和技能,为我们开发网络通信应用提供了很大的帮助。同时,CSDN作为技术开发者社区,也为我们提供了和其他开发者交流和分享经验的平台。所以,利用CSDN学习Qt TCP编程是非常有价值的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值