一、涉及到的函数

监听: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

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QtNetwork>
  4. #include <QDebug>
  5.  
  6. MainWindow::MainWindow(QWidget *parent) :
  7. QMainWindow(parent),
  8. ui(new Ui::MainWindow)
  9. {
  10. ui->setupUi(this);
  11. tcpServer = new QTcpServer(this);
  12. //使用了IPv4的本地主机地址,等价于QHostAddress("127.0.0.1")
  13. if(!tcpServer->listen(QHostAddress::LocalHost, )) {
  14. qDebug()<<tcpServer->errorString();
  15. close();
  16. }
  17. connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendMessage()));
  18. }
  19.  
  20. MainWindow::~MainWindow()
  21. {
  22. delete ui;
  23. }
  24.  
  25. void MainWindow::sendMessage()
  26. {
  27. //用于暂存要发送的数据
  28. QByteArray block;
  29. QDataStream out(&block, QIODevice::WriteOnly);
  30.  
  31. //设置数据流的版本,客户端和服务器端使用的版本要相同
  32. out.setVersion(QDataStream::Qt_4_0);
  33. out<<(quint16); //用两个字节表示数据长度
  34. out<<tr("hello TCP!!!");
  35. out.device()->seek();
  36. out<<(quint16)(block.size() - sizeof(quint16)); //总数据大小减去数据块开头两个字节大小
  37.  
  38. //获取已建立的连接的套接字
  39. QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
  40. connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater())); //失去连接后删除
  41. clientConnection->write(block);
  42. clientConnection->disconnectFromHost(); //等待数据发送完毕后关闭
  43.  
  44. //发送数据成功后,显示提示
  45. ui->label->setText("send message successful!!!");
  46. }

client.cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QtNetwork>
  4. #include <QDebug>
  5.  
  6. MainWindow::MainWindow(QWidget *parent) :
  7. QMainWindow(parent),
  8. ui(new Ui::MainWindow)
  9. {
  10. ui->setupUi(this);
  11. tcpSocket = new QTcpSocket(this);
  12. connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
  13. connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
  14. this, SLOT(displayError(QAbstractSocket::SocketError)));
  15. }
  16.  
  17. MainWindow::~MainWindow()
  18. {
  19. delete ui;
  20. }
  21.  
  22. void MainWindow::newConnect()
  23. {
  24. //初始化数据大小信系为0
  25. blockSize = ;
  26.  
  27. //取消已有的连接
  28. tcpSocket->abort();
  29. tcpSocket->connectToHost(ui->hostLineEdit->text(), ui->portLineEdit->text().toInt());
  30. }
  31.  
  32. void MainWindow::readMessage()
  33. {
  34. QDataStream in(tcpSocket);
  35. //设置数据流版本,这里要和服务器端相同
  36. in.setVersion(QDataStream::Qt_4_6);
  37.  
  38. //如果是刚开始接收数据
  39. if(blockSize == ) {
  40. //判断接收的数据是否大于两个字节,也就是文件的大小信息所占的空间
  41. //如果是则保存到blockSize变量中,否则直接返回,继续接收数据
  42. if(tcpSocket->bytesAvailable()<(int)sizeof(quint16)) return;
  43. in>>blockSize;
  44. }
  45. //如果没有得到全部的数据,则返回,继续接收数据
  46. if(tcpSocket->bytesAvailable() < blockSize) return;
  47. //将接收到的数据存放到变量中
  48. in>>message;
  49. //显示接收到的数据
  50. qDebug()<<message;
  51. ui->messageLabel->setText(message);
  52. }
  53.  
  54. void MainWindow::displayError(QAbstractSocket::SocketError)
  55. {
  56. qDebug()<<tcpSocket->errorString();
  57. }
  58.  
  59. void MainWindow::on_connectButton_clicked()
  60. {
  61. newConnect();
  62. }

三、函数说明

server有一个信号槽,当建立了新的连接就发送一个字符串。

client则需要对服务器端建立连接,这时服务器不是发送了字符串嘛。就会有readyRead信号触发,然后从流中读取数据。

QTcpSocket学习的更多相关文章

  1. C/C++学习)22.QTcpServer、QTcpSocket、QUdpSocket使用

    一.TCP/UDP通信在Qt中的实现过程: 废话不说,首先下面是Qt中TCP/UDP的实现图解: 1.Qt下TCP通信详解: 针对上图进行简单的说明:         QTcpServer用来创建服务 ...

  2. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  3. Qt 学习之路 2(72):线程和事件循环

    Qt 学习之路 2(72):线程和事件循环 <理解不清晰,不透彻>  --  有需求的话还需要进行专题学习  豆子  2013年11月24日  Qt 学习之路 2  34条评论 前面一章我 ...

  4. Qt 学习之路 2(70):进程间通信

    Qt 学习之路 2(70):进程间通信 豆子 2013年11月12日 Qt 学习之路 2 16条评论 上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的 ...

  5. Qt 学习之路 2(35):文件

    Qt 学习之路 2(35):文件 豆子 2013年1月5日 Qt 学习之路 2 12条评论 文件操作是应用程序必不可少的部分.Qt 作为一个通用开发库,提供了跨平台的文件操作能力.从本章开始,我们来了 ...

  6. QT下QThread学习(二)

    学习QThread主要是为了仿照VC下的FTP服务器写个QT版本.不多说,上图. FTP服务器的软件结构在上面的分析中就已经解释了,今天要解决的就是让每一个客户端的处理过程都可以按一个线程来单独跑.先 ...

  7. 49.Qt-网络编程之QTCPSocket和QTCPServer(实现简易网络调试助手)

    在上章 48.QT-网络通信讲解1,我们学习了网络通信基础后,本章便来实战一篇.源码正在上传中,等下贴地址. PS:支持客户端和服务器,提供源码,并且服务器支持多客户端连入,并且可以指定与个别客户端发 ...

  8. 嵌入式Linux学习笔记(六) 上位机QT界面实现和串口通讯实现

    目录 (1).参考资料 (2).QT界面布局实现 (3).数据和操作逻辑 在上一章我们实现了下位机的协议制定,并通过串口通讯工具完成了对设备内外设(LED)的状态修改,下面就要进行上位机软件的实现了( ...

  9. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

随机推荐

  1. 媲美5G的Wifi网速、“备战”资产一键领……揭秘双11小二背后的保障力量

    如今,双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此. 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“ ...

  2. 别人的双11 & 程序员的双11~

    双11,致敬所有的程序员欧巴! 愿代码的世界,只有爱,没有伤害!! ​ 点此参加阿里云双十一拼团活动:https://m.aliyun.com/act/team1111/ 阅读原文

  3. Linux操作系统之安全审计功能

    内核编译时,一般打开NET选项就打开AUDIT选项了.在系统中查看audit是否打开,root 用户执行:service auditd status 我们知道在Linux系统中有大量的日志文件可以用于 ...

  4. NOIp 图论算法专题总结 (3):网络流 & 二分图 简明讲义

    系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 网络流 概念 1 容量网络(capacity network)是一个有向图,图的 ...

  5. Mac os下设置国内镜像加速站

    无法忍受国外pip 仓库的龟速地址,安利一波国内高速镜像地址... 首推阿里云 repository 马爸爸  I ❤ u $ vim ~/.pip/pip.conf 在config中做如下配置: [ ...

  6. 用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy

    目录 目录 前文列表 扩展阅读 Flask-Admin BaseView 基础管理页面 ModelView 实现效果 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写 ...

  7. Hibernate中常用HQL

    HQL是Hibernate自带的查询语言 HQL是一种面向对象的查询语言.SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类.实例.属性等. HQL的语法很像SQL的语法 以下举例均以学生 ...

  8. python赞乎--学习开发

  9. Java程序员必精通之—synchronized

    更多Java并发文章:https://www.cnblogs.com/hello-shf/category/1619780.html 一.简介 相信每一个java程序员对synchronized都不会 ...

  10. idea配置svn正确步骤(下载svn的过程就不写了)

    打开----->File------>Settings 2. 3在vcs中选择 4进入此界面 5选择 这样svn就配置好了