QTcpSocket学习
一、涉及到的函数
监听: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, )) {
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); //用两个字节表示数据长度
out<<tr("hello TCP!!!");
out.device()->seek();
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 = ; //取消已有的连接
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 == ) {
//判断接收的数据是否大于两个字节,也就是文件的大小信息所占的空间
//如果是则保存到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信号触发,然后从流中读取数据。
QTcpSocket学习的更多相关文章
- C/C++学习)22.QTcpServer、QTcpSocket、QUdpSocket使用
一.TCP/UDP通信在Qt中的实现过程: 废话不说,首先下面是Qt中TCP/UDP的实现图解: 1.Qt下TCP通信详解: 针对上图进行简单的说明: QTcpServer用来创建服务 ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
- Qt 学习之路 2(72):线程和事件循环
Qt 学习之路 2(72):线程和事件循环 <理解不清晰,不透彻> -- 有需求的话还需要进行专题学习 豆子 2013年11月24日 Qt 学习之路 2 34条评论 前面一章我 ...
- Qt 学习之路 2(70):进程间通信
Qt 学习之路 2(70):进程间通信 豆子 2013年11月12日 Qt 学习之路 2 16条评论 上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的 ...
- Qt 学习之路 2(35):文件
Qt 学习之路 2(35):文件 豆子 2013年1月5日 Qt 学习之路 2 12条评论 文件操作是应用程序必不可少的部分.Qt 作为一个通用开发库,提供了跨平台的文件操作能力.从本章开始,我们来了 ...
- QT下QThread学习(二)
学习QThread主要是为了仿照VC下的FTP服务器写个QT版本.不多说,上图. FTP服务器的软件结构在上面的分析中就已经解释了,今天要解决的就是让每一个客户端的处理过程都可以按一个线程来单独跑.先 ...
- 49.Qt-网络编程之QTCPSocket和QTCPServer(实现简易网络调试助手)
在上章 48.QT-网络通信讲解1,我们学习了网络通信基础后,本章便来实战一篇.源码正在上传中,等下贴地址. PS:支持客户端和服务器,提供源码,并且服务器支持多客户端连入,并且可以指定与个别客户端发 ...
- 嵌入式Linux学习笔记(六) 上位机QT界面实现和串口通讯实现
目录 (1).参考资料 (2).QT界面布局实现 (3).数据和操作逻辑 在上一章我们实现了下位机的协议制定,并通过串口通讯工具完成了对设备内外设(LED)的状态修改,下面就要进行上位机软件的实现了( ...
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
随机推荐
- 每天一个Linux命令:whereis(18)
whereis whereis命令用来定位指令的二进制程序.源代码文件和man手册页等相关文件的路径. whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数- ...
- 【HDOJ6610】Game(序列带修莫队)
题意:有n堆石子,第n堆有a[i]个,A先选择一个范围[L,R],B选择一个子区间[l,r],之后照nim游戏的规则进行 现在有询问与操作 每次询问B在给定的[L,R]内有多少种子区间的取法使得A必胜 ...
- 【CF1210D】Konrad and Company Evaluation(vector,图论)
题意:有i个人,m对两两之间的关系,第i个人初始的薪水为i,有q次操作,第i次操作会把v[i]号的薪水提升成n+i 如果两个人之间存在关系,薪水高的会向薪水低的炫耀 定义u,v,w为一个三元组,当u向 ...
- 2018-2019-2 20175126谢文航 实验四《Android开发基础》实验报告
一.实验封面 课程:Java程序设计 班级:1751 班 姓名:谢文航 学号:20175126 指导教师:娄嘉鹏 实验日期:2019年5月15日 实验时间:--- 实验序号:实验四 实验名称:Andr ...
- java并发编程笔记(十)——HashMap与ConcurrentHashMap
java并发编程笔记(十)--HashMap与ConcurrentHashMap HashMap参数 有两个参数影响他的性能 初始容量(默认为16) 加载因子(默认是0.75) HashMap寻址方式 ...
- Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用
摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...
- 使用systemctl管理服务
系统服务,开机不需要登录就能运行的程序(相当于开机自启)/usr/lib/systemd/system 用户服务,需要登录后才能运行的程序/usr/lib/systemd/user 目录下又存在两种类 ...
- leetcode.图.207课程表-Java
1. 具体题目 现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1].给定 ...
- mysqldump 多实例备份
通过/var/lib/mysql/mysql4406.sock 登录到某一个实例,备份 mysqldump -uroot -p --all-databases --add-drop-databas ...
- 【题解】Beads
题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数, ...