目录

  • 一、服务器端
    • 1、QT中TCP服务器的开发思路
    • 2、QT服务器界面设计
    • 3、QT服务器代码实现
  • 二、客户端
    • 1、QT中TCP客户端的开发思路
    • 2、QT客户端界面设计
    • 3、QT客户端代码实现

网络编程有TCP和UDP。

TCP编程需要用到两个类:
1、QTcpServer——实现服务器的端口监听,可以提供一种服务。
2、QTcpSocket——实现套接字类,有消息的封装,可以读取和写入。

注意: QTcpServer、和QTcpSocket两个类在服务器中会用到,而客户端中只用到QTcpSocket类

一、服务器端

1、QT中TCP服务器的开发思路

1、开启服务器开启端口服务:建立QTcpServer对象,并用其中的listen()方法就可以开启指定的端口。

tcpServer->listen(QHostAddress::Any,ui->lineEdit_port->text().toUInt());    //服务器对端口号进行监听

2、当有客户端连接到服务器时,系统会接收到newConnection信号,所以需要在对应的槽函数中获取用于通信的套接字(QTcpServer的nextPendingConnection()函数获取套接字)。

tcpSocket = tcpServer->nextPendingConnection();     //获取与客户端进行通信的套接字

3、客户端有数据过来,则会产生一个readyRead信号,从对应的槽函数中通过套接字的readAll()等相关函数读取数据。

buf = QString(tcpSocket->readAll());    //用套接字读取客户端发来的数据

4、通过套接字的write()函数向客户端发送数据。

tcpSocket->write(ui->lineEdit_send->text().toLocal8Bit().data());

2、QT服务器界面设计

3、QT服务器代码实现

(1)、添加模块和和头文件

1)在pro文件中添加一行内容:QT += network
2)在widget.h头文件中添加需要用到的服务器头文件

#include "QTcpServer"
#include "QTcpSocket"

(2)在widget构造函数中创建QTcpServer、和QTcpSocket对象

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);tcpServer = new QTcpServer(this);   //创建一个服务器类tcpSocket = new QTcpSocket(this);   //创建一个socket类
}

(3)写”启动服务器"按键的槽函数(实现按下就启动服务器,再次按下就关闭服务器)

服务器实现监听;将newConnection信号和槽函数进行绑定

void Widget::on_pushButton_startOrStop_clicked()
{if(ui->pushButton_startOrStop->text() == "启动服务器"){tcpServer->listen(QHostAddress::Any,ui->lineEdit_port->text().toUInt());    //服务器对端口号进行监听connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_slot())); //有网络用户连接进来,就会执行槽函数ui->pushButton_startOrStop->setText("关闭服务器");ui->label_startOrClose->setStyleSheet("border-image: url(:/Pic/server_open.png);");}else{tcpServer->close();ui->pushButton_startOrStop->setText("启动服务器");ui->label_startOrClose->setStyleSheet("border-image: url(:/Pic/server_close.png);");}
}

(4)有用户连接服务器时,系统收到newConnection信号,这里写对应的槽函数
进入这个槽函数表示有用户连接进来了,所以获取该套接字;并判断是否接收客户端数据(readyRead信号和槽函数绑定)
在头文件中声明槽函数

private slots:void newConnection_slot();

实现槽函数功能

void Widget::newConnection_slot()
{tcpSocket = tcpServer->nextPendingConnection();     //获取与客户端进行通信的套接字ui->label_clientIp->setText(tcpSocket->peerAddress().toString());   //获取客户端的IP地址connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot())); //客户端有数据到达服务器,就会产生readyRead信号
}

(5)服务器接收到数据后,会产生readyRead信号,这里实现对应槽函数功能

在头文件中声明槽函数

private slots:void readyRead_slot();

实现槽函数功能:接收来自客户端的数据

void Widget::readyRead_slot()
{QString buf;buf = QString(tcpSocket->readAll());    //用套接字读取客户端发来的数据ui->plainTextEdit_receive->appendPlainText(buf);
}

(6)实现“发送”按钮的槽函数

void Widget::on_pushButton_send_clicked()
{tcpSocket->write(ui->lineEdit_send->text().toLocal8Bit().data());
}

二、客户端

1、QT中TCP客户端的开发思路

1、创建QTcpSocket对象,并用connectToHost()函数通过IP和端口号连接服务器。

tcpSocket = new QTcpSocket(this);
tcpSocket->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_port->text().toUInt());   //根据IP地址和端口号连接服务器

2、客户端成功连接上服务器,系统会产生connected信号。(所以需要将信号和槽函数进行绑定)

connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_slot()));   //客户端连接服务器成功后会产生connected信号

3、客户端收到服务器发送来的数据,会产生readyRead信号,在connected信号对应的槽函数中,将readyRead信号和对应的槽函数进行绑定。

connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot()));     //和服务器连接成功后,就需要就收服务器发送过来的数据了,

4、通过套接字对象读取服务器发来的数据。(用readall()等函数)

tcpSocket->readAll();      //从套接字中读取服务器发来的数据

5、通过套接字向服务器发送数据。(用write()函数)

tcpSocket->write(ui->lineEdit_send->text().toLocal8Bit().data());       //向服务器发送数据

2、QT客户端界面设计

3、QT客户端代码实现

(1)、添加模块和和头文件

1)在pro文件中添加一行内容:QT += network
2)在widget.h头文件中添加需要用到的服务器头文件

#include "QTcpSocket"

(2)在widget构造函数中创建QTcpSocket对象

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);tcpSocket = new QTcpSocket(this);   //创建一个socket类
}

(3)实现“连接服务器”按钮的槽函数

void Widget::on_pushButton_startOrStop_clicked()
{if(ui->pushButton_startOrStop->text() == "连接服务器")   //表示可以连接服务器{tcpSocket->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_port->text().toUInt());   //根据IP地址和端口号连接服务器connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_slot()));   //客户端连接服务器成功后会产生connected信号ui->pushButton_startOrStop->setText("断开连接");    //修改按键的提示字,为下次关闭做准备ui->label_startOrClose->setStyleSheet("border-image: url(:/Pic/client_open.png);");     //修改标签的样式表}else        //表示可以断开和服务器的连接{tcpSocket->close();     //断开和服务器的连接ui->pushButton_startOrStop->setText("连接服务器");   //修改按键的提示字,为下次连接做准备ui->label_startOrClose->setStyleSheet("border-image: url(:/Pic/client_close.png);");}}

(4)客户端连接到服务器会触发connected信号,实现对应槽函数

void Widget::connected_slot()
{connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot()));     //和服务器连接成功后,就需要就收服务器发送过来的数据了,//如果客户端收到发送过来的数据,系统会产生readyRead信号
}

(5)客户端收到服务器发送过来的数据会触发readyRead信号,实现对应槽函数

void Widget::readyRead_slot()
{//这里是读取所有的信息,后期建议修改为分片读取,防止大文件一次读取不完ui->plainTextEdit->appendPlainText(QString(tcpSocket->readAll()));      //从套接字中读取服务器发来的数据
}

(6)为“发送”按钮实现槽函数

void Widget::on_pushButton_send_clicked()
{//tcpSocket->write(ui->lineEdit_send->text().toLocal8Bit().data());       //向服务器发送数据tcpSocket->write(ui->lineEdit_send->text().toUtf8());     //可以接收到服务器发送过来的汉字
}

附工程源文件下载链接:
QT客户端+服务器源码下载

QT网络编程——TCP服务器和客户端通信相关推荐

  1. Qt网络编程——TCP服务器与客户端互发信息

    前言 前一个博客,试了TCP的服务器与客户端的连接与断开,接下就是客户端与服务器互发信息. 客户端 1.往服务器发送信息 //发送消息 void Client::on_buttonSendMessag ...

  2. qt android 网络编程实例,QT网络编程Tcp下C/S架构的即时通信实例

    先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include #include #include # ...

  3. Qt网络编程——TCP

    Qt网络编程--TCP 1. 概念 2. 服务器 3. 客户端 4. TCP服务器和客户端互传文件 5. 资源下载 1. 概念 TCP(Transmission Control Protocol, 传 ...

  4. 【Linux】socket网络编程之服务器与客户端的数据交互

    [Linux]socket网络编程之服务器与客户端的数据交互 前言参考 argc !=2是什么意思 inet pton函数 对stdin,stdout 和STDOUT_FILENO,STDIN_FIL ...

  5. Linux下TCP网络编程-创建服务器与客户端

    一.前言 互联网概念诞生于20世纪60年代末,从9几年中国接入互联网开始到现在,生活的每个角落都能看到网络的使用.现在物联网时代.共享经济的到来,生活中不仅仅电脑.手机可以接入网络,身边的各个设备也能 ...

  6. nodejs TCP服务器和客户端通信的socket结构

    这个结构我们大学时上Unix网络编程的专业课就学过了: nodejs服务器端调用net模块的createServer方法启动一个TCP服务器,这个方法要指定一个回调函数,每当新的客户端发起连接后,回调 ...

  7. python网络编程---TCP服务器

    0x01 环境 python2 pycharm 0x02 程序 客户端程序: # -*- coding:UTF-8 -*- import socket ''' target_host='www.bai ...

  8. 【QT网络编程】实现UDP协议通信

    文章目录 概要:本期主要讲解QT中对UDP协议通信的实现. 一.UDP协议通信 二.Qt中UDP协议的处理 1.QUdpSocket 三.Qt实现UDP通信 1.客户端 2.服务器端 结尾 概要:本期 ...

  9. C语言实现TCP服务器与客户端通信

    以上是TCP通信客户端与服务器实现通信的基本原理流程图. 1.客户端的实现(4个步骤) 1.1创建socket对象 1.2请求连接 1.3发送数据 1.4关闭套接字 #include<stdio ...

最新文章

  1. 六种方法实现CSS三栏布局
  2. 2013ACM多校联合(2)
  3. ADO.NET基本运用随笔
  4. 通俗易懂!视觉slam第九部分——光流(Optical Flow)
  5. php和fastapi,FastAPI快速开始
  6. 时刻警戒当前终端目录
  7. paip.jdk1.4 1.5(5.0) 1.6(6.0) 7.0 8.0特点比较与不同
  8. 怎么看蛋白质编码序列_墨鱼的“墨汁”可以吃吗,它有什么营养?看完就明白,涨知识了...
  9. 2021 年 五一数学建模比赛 C 题
  10. 关于饿了么ui框架的使用之select的应用
  11. WIN10桌面美化(折腾)
  12. sentence_transformers 微调模型
  13. 蓝天P7xxtm 系列9代最新BIOS
  14. CM9和AOKP的区别
  15. 大疆aeb连拍_一张图带你轻松读懂摄影必备专业术语~
  16. MacOS Xcode与Swift版本对应关系
  17. stm32 led屏控制卡_如何实现LED双面透明显示屏,双面LED透明屏
  18. 百度人脸产品套件开箱体验-壁虎开机初体验
  19. java小项目 ATM机(简易版)
  20. 【记录】U盘安装Ubuntu20.04系统

热门文章

  1. stm32 移植java_把Lua移植到stm32上,效果不错! (amoBBS 阿莫电子论坛)
  2. 【详细图解】一步一步教你自定义博客园(cnblog)界面
  3. 分享搭建脚手架的一些经验
  4. 矢量(vector)瓦片与栅格(raster)瓦片对比
  5. TensorFlow-gpuCould not load dynamic library ‘cudart64_102.dll‘; dlerror: cudart64_102.dll not found
  6. jmeter结果树为空_【转载】 jmeter 命令行模式(非GUI)运行脚本,察看结果树结果为空,解决办法...
  7. C语言实现—学生成绩管理系统
  8. C语言:初识数组及数组的复制
  9. 分子动力学开源模拟软件LAMMPS现在可以在AMD的GPU上运行
  10. 《黑客帝国》完全解析(转)