今天需要做一个服务器端的tcp通信

因为之前没有用过qt的方法,只用过C语言版本的,所以干脆客户端和服务器端都查了下,做个笔记。

先上代码

客户端.h

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTcpSocket>
#include <QHostAddress>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_Connect_clicked();void on_pushButton_Send_clicked();void socket_Read_Data();void socket_Disconnected();private:Ui::MainWindow *ui;QTcpSocket *socket;
};#endif // MAINWINDOW_H

客户端.cpp

//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);socket = new QTcpSocket();//连接信号槽QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);ui->pushButton_Send->setEnabled(false);ui->lineEdit_IP->setText("192.168.0.109");ui->lineEdit_Port->setText("8088");}MainWindow::~MainWindow()
{delete this->socket;delete ui;
}void MainWindow::on_pushButton_Connect_clicked()
{if(ui->pushButton_Connect->text() == tr("connect")){int port;//获取端口号port = ui->lineEdit_Port->text().toInt();//取消已有的连接socket->abort();//连接服务器socket->connectToHost(ui->lineEdit_IP->text(), port);//等待连接成功if(!socket->waitForConnected(30000)){qDebug() << "Connection failed!";return;}qDebug() << "Connect successfully!";//发送按键使能ui->pushButton_Send->setEnabled(true);//修改按键文字ui->pushButton_Connect->setText("断开连接");}else{//断开连接socket->disconnectFromHost();//修改按键文字ui->pushButton_Connect->setText("连接");ui->pushButton_Send->setEnabled(false);}
}void MainWindow::on_pushButton_Send_clicked()
{qDebug() << "Send: " << ui->textEdit_Send->toPlainText();//获取文本框内容并以ASCII码形式发送socket->write(ui->textEdit_Send->toPlainText().toLocal8Bit());socket->flush();
}void MainWindow::socket_Read_Data()
{//读取缓冲区数据QByteArray buffer = socket->readAll();if(!buffer.isEmpty()){QString str = ui->textEdit_Recv->toPlainText().fromLocal8Bit(buffer);qDebug() << "recv data = " << str;//刷新显示ui->textEdit_Recv->setText(str);}
}void MainWindow::socket_Disconnected()
{//发送按键失能ui->pushButton_Send->setEnabled(false);//修改按键文字ui->pushButton_Connect->setText("连接");qDebug() << "Disconnected!";
}

服务端.h

#ifndef TCPSERVER_H
#define TCPSERVER_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>QT_BEGIN_NAMESPACE
namespace Ui { class TcpServer; }
QT_END_NAMESPACEclass TcpServer : public QWidget
{Q_OBJECTpublic:TcpServer(QWidget *parent = nullptr);~TcpServer();void setHostAddress(QString address){m_hostAddress=address;}void setTcpServerPort(int port){m_tcpServerPort=port;}protected slots:void server_New_Connect();void socket_Read_Data();void socket_Disconnected();private slots:void on_writeBtn_clicked();void on_setListen_clicked();void on_setAdd_clicked();void on_setPort_clicked();private:Ui::TcpServer *ui;QTcpServer* mServer;QTcpSocket* mSocket;QString m_hostAddress = "192.168.0.100";//"192.168.0.109";int m_tcpServerPort = 8000;//8080;
};
#endif // TCPSERVER_H

服务端.cpp

#include "tcpserver.h"
#include "ui_tcpserver.h"TcpServer::TcpServer(QWidget *parent): QWidget(parent), ui(new Ui::TcpServer)
{ui->setupUi(this);//1.创建一个tcpServer对象mServer = new QTcpServer(this);mSocket= new QTcpSocket;//2.监听一个端口,使得客户端可以使用这个端口访问服务器
//    mServer->listen(QHostAddress::Any, 8080);//3.链接信号槽connect(mServer,&QTcpServer::newConnection,this,&TcpServer::server_New_Connect);
}TcpServer::~TcpServer()
{delete ui;
}void TcpServer::server_New_Connect()
{//获取客户端连接mSocket = mServer->nextPendingConnection();qDebug() << "A Client connect!";//连接QTcpSocket的信号槽,以读取新数据QObject::connect(mSocket, &QTcpSocket::readyRead, this, &TcpServer::socket_Read_Data);QObject::connect(mSocket, &QTcpSocket::disconnected, this, &TcpServer::socket_Disconnected);
}void TcpServer::socket_Read_Data()
{//读取缓冲区数据QByteArray buffer = mSocket->readAll();if(!buffer.isEmpty()){ui->recvData->clear();ui->recvData->setText(QString::fromLocal8Bit(buffer));}
}void TcpServer::socket_Disconnected()
{//发送按键失能qDebug() << "Disconnected!";
}void TcpServer::on_writeBtn_clicked()
{QString buf = "hello tcp " + ui->recvData->toPlainText();
//    char *buffer = buf.toLatin1().data();mSocket->write(buf.toLocal8Bit());
//    qDebug() << "server wirte buffer = " << buffer;mSocket->flush();
}void TcpServer::on_setListen_clicked()
{qDebug() << "start to listen";mServer->listen(QHostAddress::Any, 8088);
}void TcpServer::on_setAdd_clicked()
{setHostAddress("192.168.0.109");qDebug() << "set host address: " << "192.168.0.109";
}void TcpServer::on_setPort_clicked()
{setTcpServerPort(8088);qDebug() << "set host port: " << 8088;
}

因为只是做个demo,不需要太过细节,所以服务端返回的数据就是在收到客户端数据的基础上加了hello tcp;

这个demo只能做一个简单的小框架。

qt的封装,利用信号和槽使tcp通讯十分方便

客户端

  1. socket = new QTcpSocket();//申请socket对象
  2. socket->connectToHost(ip, port);//链接已经在监听的服务器ip和端口
  3. socket->write();//对已经socket写入数据
  4. QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);//如果服务器端发送过来数据,就会触发readyRead这个信号,我们在客户端只需要完成他的槽函数里面的操作即可,发送接收数据要注意数据格式,防止中文出现乱码

服务器

1.需要同时用到QTcpServer类和QTcpSocket
mServer = new QTcpServer;
mSocket= new QTcpSocket;
2.监听一个端口,使得客户端可以使用这个端口访问服务器
mServer->listen(QHostAddress::Any, 8080);

3.链接信号槽    connect(mServer,&QTcpServer::newConnection,this,&TcpServer::server_New_Connect);

当有用户链接进来,就会触发newConnection信号,我们只需要实现槽函数

4. mSocket = mServer->nextPendingConnection();//获取客户端连接

//连接QTcpSocket的信号槽,以读取新数据

    QObject::connect(mSocket, &QTcpSocket::readyRead, this, &TcpServer::socket_Read_Data);
    QObject::connect(mSocket, &QTcpSocket::disconnected, this, &TcpServer::socket_Disconnected);

5.read和write数据 和客户端一样

记录下吧,后面用到udp的时候,再写精致点

ps: 链接时不能开翻墙软件,否则链接失败

Qt之tcp的简单使用相关推荐

  1. 【QT实现TCP和UDP协议通信(一)】

    QT实现TCP和UDP协议通信(一) 编程环境 :Windows10 x64 下 QtCreator 语言 :C++ 作者 :wddkxg 时间 :2022.4.24 项目 :Server + Cli ...

  2. linux系统下Qt应用程序重启,嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws)...

    嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws) 应用软件一般都有这样的业务需求: 当有新版本的APP,则程序就需要执行更新,更新完毕后(所谓的更新大多就是以覆盖的方式),不需要关 ...

  3. QT实现TCP网络通信

    QT实现TCP网络通信 前言 一.目标 二.思路总览 服务器端主要代码 客户端主要代码 三.代码 客户端代码 mainwindow.h mainwindow.cpp mainwindow.ui 服务器 ...

  4. java 网络编程简单聊天_网络编程之 TCP 实现简单聊天

    网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...

  5. linux下TCP通信简单实例

    linux下TCP通信简单实例 基于TCP(面向连接)的socket编程,分为服务器端和客户端 服务器端的流程如下: (1)创建套接字(socket) (2)将套接字绑定到一个本地地址和端口上(bin ...

  6. Qt 2D绘图功能简单总结

    文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...

  7. Qt 多线程TCP服务端一键关闭所有客户端

    Qt 多线程TCP服务端一键关闭所有客户端 任务描述: 实现多线程TCP服务端一键关闭所有客户端的连接. 解决过程: 1.Qt的服务端提供了close的功能,但是只用来不响应新接入的客户端. 手册中是 ...

  8. Qt下Tcp传输文件

    Qt下Tcp传输文件 文章目录 Qt下Tcp传输文件 1.服务端 2.客户端 1.服务端 //ServerWidgets.h #ifndef SERVERWIDGET_H #define SERVER ...

  9. QT学习——Tcp客户端通信(本地回环)

    1.Linux下Tcp通信 2.Qt下Tcp通信 1)Tcp框架--简图 下面的文本框是写入文本,上面的是显示发送后接收到的信息.这里发送的消息并不会立刻显示到界面上,而是要通过 readyRead( ...

最新文章

  1. 手把手教你 Socket 通信(TCP/IP)
  2. pygame两图层怎么搞_每天解决一个卖酒问题(176):小白怎么开拓市场?
  3. Eureka集群搭建
  4. 【2018.3.24】模拟赛之四-ssl2548 旋转【暴力模拟】
  5. SAP License:CO第一夜-成本要素会计
  6. web渗透测试思路浅谈-----漏洞发现及利用
  7. tts语音合成小玩具
  8. 蚁群算法最短路径规划多出口情况及问题答疑
  9. linux之终端的灵活使用。SCREEN
  10. RedHat7安装及小红帽硬盘分区建议
  11. 硬盘分区整数计算方法
  12. Python的学习笔记案例4--52周存钱挑战1.0
  13. linux怎么进入自己添加的软盘,linux – 创建没有mount的虚拟软盘映像?
  14. html5四季特点,成都气候:成都温度、成都天气、成都常年气温、成都四季特点,chengdu weather...
  15. orge,Nebula与klayGE对比
  16. 服务器文件夹只读属性去不掉,C# 去除文件或 文件夹只读属性
  17. RTT WK2412 spi-uart
  18. Python网络爬虫实战(一)快速入门
  19. STM32关于PVD低电压能检测的知识
  20. 抖音Vlog短视频达人必备2000+PR无缝转场过渡模板 全格式Premiere转场包

热门文章

  1. mybatis 之 parameterType=list1
  2. 报表性能优化方案之善用参数注入
  3. python学习笔记15-执行环境
  4. 分析:微软最终将赢得平板电脑市场的5个理由
  5. Miller_Rabin测试法
  6. javascript原生代码取单选框的值
  7. [MetalKit]7-Using-MetalKit-part-6使用MetalKit6
  8. 《实施Cisco统一通信管理器(CIPT1)》一2.2 CUCM:单站点部署模型
  9. 菜鸟学Linux 第030篇笔记 yum使用,源码编译安装
  10. 【服务器环境搭建-Centos】tmpfs,【转载】