用Qt搭建一个简易的TCP客户端和服务器
简易理解TCP传输流程
什么是TCP协议,为什么要用TCP协议
TCP协议报文格式
TCP建立连接时的三次握手过程
TCP关闭连接的四次挥手
服务器端搭建
客户端搭建
总结
你好! 这是本人的第一篇博客。如有错误,请批评指正。
简易理解TCP传输流程
什么是TCP协议,为什么要用TCP协议
TCP协议即transmission control protocal,即传输控制协议。是一种用于在应用程序之间进行信息传递的数据格式的协议。TCP协议并不是单独存在的,它还要结合网络层的IP协议使用。整个TCP/IP协议包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些协议就可以自由的和其他终端进行数据交流。而ip协议、TCP协议很像套在数据上的一层衣服,是为了让其他计算机能够认识里边的东西。整个数据传输过程就很像俄罗斯套娃,先给数据一层一层套娃,把套好的数据发送给另一个终端之后,在另一个终端那儿再进行一层一层解套,最终得到我们想要的数据。
TCP协议报文格式
要理解TCP协议的传输过程,我们得先了解TCP是如何给数据进行套娃的,也即数据是如何被包装的。所以接下来要了解TCP的报文格式(先上个图): 1)源端口号
2)目标端口号
3)序列号:因为在TCP是面向字节流的,他会将报文都分成一个个字节,给每个字节进行序号编写,比如一个报文有900个字节组成,那么就会编成1-900个序号,然后分几部分来进行传输。比如第一次传,序列号就是1,传了50个字节, 那么第二次传,序列号就为51,所以序列号就是传输的数据的第一个字节相对所有的字节的位置。
4)确认应答:如刚说的例子,第一次传了50个字节给对方,对方也会回应你,其中带有确认应答,就是告诉你下一次要传第51个字节来了,所以这个确认应答就是告诉对方要传第多少个字节了
5)首部长度:就是首部的长度,
6)保留:给以后有需要在用,这个保留的位置放的东西是跟控制位类似的
7)控制位:目前有的控制位为6个
URG:紧急控制位,当URG为1时,表名紧急指针字段有效,标识该报文是一个紧急报文,传送到目标主机后,不用排队,应该让该报文尽量往下排,让其早点让应用程序给接受。
ACK:确认序号控制位,当ACK为1时,确认序号ack才有效。当ACK为0时,确认序号没用。
PSH:推送控制位,当为1时,当遇到此报文时,会减少数据向上交付,本来想应用进程交付数据是要等到一定的缓存大小才发送的,但是遇到它,就不用在等足够多的数据才向上交付,而是让应用进程早点拿到此报文,这个要和紧急分清楚,紧急是插队,但是提交缓存大小的数据不变,这个推送就要排队,但是遇到他的时候,会减少交付的缓存数据,提前交付。
RST:复位控制位,报文遇到很严重的差错时,比如TCP连接出错等,会将RST置为1,然后释放连接,全部重新来过。
SYN:同步控制位,在进行连接的时候,也就是三次握手时用得到,下面会具体讲到,配合ACK一起使用
FIN:终止控制位,在释放连接时,也就是四次挥手时用的。
8)窗口:指发送报文段一方的接受窗口大小,用来控制对方发送的数据量(从确认号开始,允许对方发送的数据量)。也就是后面需要讲的滑动窗口的窗口大小
9)检验和:检验首部和数据这两部分,和UDP一样,需要拿到伪首部中的数据来帮助检测
10)选项:长度可变,介绍一种选项,最大报文段长度MSS。 能够告诉对方TCP,我的缓存能接受报文段的数据字段的最大长度是MSS个字节。如果没有使用选项,那么首部固定是20个字节。
11)填充:就是为了让其成为整数个字节
TCP建立连接时的三次握手过程
TCP客户端和服务器建立连接的三次握手,其实就是客户端和服务器之间总共发送了三个包。
第一次握手: 由客户端先发送一个SYN包给服务器,将标志位SYN置为1,随机生成一个seq=j。发送后客户端进入SYN_SENT状态,等待服务器端确认。 第二次握手: 服务器端接收到客户端发来的SYN包后,检验SYN是否为1,SYN为1则知道了客户端想建立连接,随即将数据包标志位SYN和ACK都置为1,ACK为1表示服务器端确认收到了客户端的包数据。服务器端会随机产生一个seq=k,并且会将从客户端收到的序列号加1,作为确认序号ack再发回给客户端以确认连接请求。此时,服务器端将进入SYN_RCVD状态。 第三次握手: 客户端在收到数据包后,检验确认序号是否为j+1,ACK是否为1。若检验正确则将ACK置为1,ack设置为k+1。并将该数据包发送给服务器端,服务器端检查ack是否为k+1,ACK是否为1,如果正确则连接建立成功,服务器端和客户端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间就可以开始传输数据了。
TCP关闭连接的四次挥手
断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
第一次挥手: 客户端发送一个FIN包,用来关闭客户端到服务器的数据传送,也就是客户端告诉服务器:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,客户端依然会重发这些数据),但是,此时客户端还可以接受数据。FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 第二次挥手: 服务器收到FIN包后,发送一个ack给对方并且带上自己的序列号seq=k,确认序号ack为收到序号+1(u+1)。此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。 这段状态结束后,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。 第三次挥手: 服务器发送一个FIN,用来关闭服务器到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。 第四次挥手: 主动关闭方收到FIN后,将ACK置1,发送一个ack给被动关闭方,确认序号为收到序号+1(即w+1),此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
至此,完成四次挥手。
服务器端搭建
本次实验的开发环境是Qt5.1.12。本实验搭建TCP服务器/客户端主要利用sockect编程。 在服务器端的程序中,我们本地主机的一个端口,这里使用6666,然后关联newConnection()
信号与自己写的sendMessage()
槽。就是说一旦有客户端的连接请求,就会执行sendMessage()
函数,在这个函数里我们发送一个简单的字符串。
1.新建QtGui应用
项目名为tcpServer,基类选择QWidget
,类名为Widget
。完成后打开项目文件tcpServer.pro
并添加一行代码:QT += network
,然后保存该文件。
2.在widget.ui的设计区添加一个Label,更改其显示文本为“等待连接”,然后更改其objectName
为statusLabel
,用于显示一些状态信息。设计效果如下:
3.在widget.h
文件中做以下更改。
添加头文件:#include
添加private对象:
QTcpServer * tcpServer;
添加私有槽:
private slots:
void sendMessage ( ) ;
4.在widget.cpp文件中进行更改。 在其构造函数中添加代码:
tcpServer = new QTcpServer ( this ) ;
if ( ! tcpServer- > listen ( QHostAddress: : LocalHost, 6666 ) )
{
qDebug ( ) << tcpServer- > errorString ( ) ;
close ( ) ;
}
connect ( tcpServer, SIGNAL ( newConnection ( ) ) , this , SLOT ( sendMessage ( ) ) ) ;
我们在构造函数中使用tcpServer的listen()
函数进行,然后关联了newConnection()
和我们自己的sendMessage()
函数。
下面我们实现sendMessage()
函数。
void Widget: : sendMessage ( ) {
QByteArray block;
QDataStream out ( & block, QIODevice: : WriteOnly) ;
out. setVersion ( QDataStream: : Qt_4_6) ;
out<< ( quint16) 0 ;
out<< tr ( "测试消息!!!" ) ;
out. device ( ) - > seek ( 0 ) ;
out<< ( quint16) ( block. size ( ) - sizeof ( quint16) ) ;
QTcpSocket * clientConnection = tcpServer- > nextPendingConnection ( ) ;
connect ( clientConnection, SIGNAL ( disconnected ( ) ) , clientConnection,
SLOT ( deleteLater ( ) ) ) ;
clientConnection- > write ( block) ;
clientConnection- > disconnectFromHost ( ) ;
ui- > statusLabel- > setText ( "send message successful!!!" ) ;
}
对于sendMessage()
函数:
(1)为了保证在客户端能接收到完整的文件,我们都在数据流的最开始写入完整文件的大小信息,这样客户端就可以根据大小信息来判断是否接受到了完整的文件。而在服务器端,在发送数据时就要首先发送实际文件的大小信息,但是,文件的大小一开始是无法预知的,所以这里先使用了out<<(quint16) 0
;在block
的开始添加了一个quint16
大小的空间,也就是两字节的空间,它用于后面放置文件的大小信息。然后out<输入实际的文件,这里是字符串。当文件输入完成后我们再使用out.device()->seek(0);
返回到block
的开始,加入实际的文件大小信息,也就是后面的代码,它是实际文件的大小:out<<(quint16) (block.size() - sizeof(quint16));
(2)在服务器端我们可以使用tcpServer
的nextPendingConnection()
函数来获取已经建立的连接的Tcp套接字,使用它来完成数据的发送和其它操作。比如这里,我们关联了disconnected()
信号和deleteLater()
槽,然后我们发送数据
clientConnection- > write ( block) ;
然后是
clientConnection- > disconnectFromHost ( ) ;
它表示当发送完成时就会断开连接,这时就会发出disconnected()
信号,而最后调用deleteLater()
函数保证在关闭连接后删除该套接字clientConnection
。
客户端搭建
我们在客户端程序中向服务器发送连接请求,当连接成功时接收服务器发送的数据。
1.新建Qt Gui应用,
项目名tcpClient,基类选择QWidget
,类名为Widget
。完成后打开项目文件tcpClient.pro
并添加一行代码:QT += network
,然后保存该文件。
2.我们在widget.ui
中添加几个标签Label
和两个Line Edit
以及一个按钮Push Button
。设计效果如下图所示。 其中“主机”后的LineEdit
的objectName
为hostLineEdit,“端口号”后的为portLineEdit
。
“收到的信息”标签的objectName
为messageLabel
。
3.在widget.h
文件中做更改。
添加头文件:#include
添加private变量:
QTcpSocket * tcpSocket;
QString message;
quint16blockSize;
添加私有槽:
private slots:
void newConnect ( ) ;
void readMessage ( ) ;
void displayError ( QAbstractSocket: : SocketError) ;
4.在widget.cpp
文件中做更改。
(1)在构造函数中添加代码:
tcpSocket = new QTcpSocket ( this ) ;
connect ( tcpSocket, SIGNAL ( readyRead ( ) ) , this , SLOT ( readMessage ( ) ) ) ;
connect ( tcpSocket, SIGNAL ( error ( QAbstractSocket: : SocketError) ) ,
this , SLOT ( displayError ( QAbstractSocket: : SocketError) ) ) ;
这里关联了tcpSocket的两个信号,当有数据到来时发出readyRead()
信号,我们执行读取数据的readMessage()
函数。当出现错误时发出error()
信号,我们执行displayError()
槽函数。
(2)实现newConnect()
函数。
void Widget: : newConnect ( )
{
blockSize = 0 ;
tcpSocket- > abort ( ) ;
tcpSocket- > connectToHost ( ui- > hostLineEdit- > text ( ) ,
ui- > portLineEdit- > text ( ) . toInt ( ) ) ;
}
这个函数实现了连接到服务器,下面会在“连接”按钮的单击事件槽函数中调用这个函数。
(3)实现readMessage()
函数。
void Widget: : readMessage ( )
{
QDataStream in ( tcpSocket) ;
in . setVersion ( QDataStream: : Qt_4_6) ;
if ( blockSize== 0 )
{
if ( tcpSocket- > bytesAvailable ( ) < ( int) sizeof ( quint16) ) return ;
in >> blockSize;
}
if ( tcpSocket- > bytesAvailable ( ) < blockSize) return ;
in >> message;
ui- > messageLabel- > setText ( message) ;
}
这个函数实现了数据的接收,它与服务器端的发送函数相对应。首先我们要获取文件的大小信息,然后根据文件的大小来判断是否接收到了完整的文件。
(4)实现displayError()
函数。
void Widget: : displayError ( QAbstractSocket: : SocketError)
{
qDebug ( ) << tcpSocket- > errorString ( ) ;
}
这里简单的实现了错误信息的输出。
(5)我们在widget.ui
中进入“连接”按钮的单击事件槽函数,然后更改如下。
void Widget: : on_pushButton_clicked ( )
{
newConnect ( ) ;
}
这里直接调用了newConnect()
函数。
总结
你可能感兴趣的:(tcpip,qt,c++)
C# 语法 vs. C++ 语法:全面对比与核心区别解析
不会编程的程序猿ᅟ
c# c++ 开发语言
引言C#和C++是两种广泛使用的编程语言,分别由微软和BjarneStroustrup开发。尽管它们都属于C语言家族,但在语法、特性和应用场景上存在显著差异。本文将从多个角度详细对比C#和C++的语法区别,帮助你更好地理解这两种语言的特点。一、语言设计目标1.C#设计目标:C#是一种现代化的、面向对象的编程语言,旨在简化开发过程,提高开发效率。主要应用:Windows应用、Web开发、游戏开发(U
QTextEdit达到指定行数自动清理+光标移动到末端(QT/C++)
ibuki_fuko
Qt与C++ qt 开发语言
标题2:QTextEdit/QPlainTextEdit/QLineEdit/QTextBrowser达到指定行数自动清理标题3:设置QTextEdit/QPlainTextEdit/QLineEdit/QTextBrowser的光标移动到文本末端标题4:设置QT文本框显示内容过多自动清理且光标移动到文本框末端1、使用场景:有大量数据实时刷新显示在QT的文本框相关组件时,需要清理部分之前的数据,并
C语言/C++常见习题问答集锦(七十八)之数字流星雨
五一编程
笔记 c语言 c++ 算法 数据结构 vc++
C语言/C++常见习题问答集锦(七十八)之数字流星雨程序之美流星雨是在夜空中有许多的流星从天空中一个所谓的辐射点发射出来的天文现象。这些流星是宇宙中被称为流星体的碎片,在平行的轨道上运行时以极高速度投射进入地球大气层的流束。大部分的流星体都比沙砾还要小,因此几乎所有的流星体都会在大气层内被销毁,不会击中地球的表面;能够撞击到地球表面的碎片称为陨石。数量特别庞大或表现不寻常的流星雨会被称为“流星突出
【北上广深杭大厂编程面试题】C++篇...这里介绍new、delete、malloc free之间的关系?
努力毕业的小土博^_^
计算机基础知识和编程 c++ java 面试 开发语言 编程
【北上广深杭大厂编程面试题】C++篇…这里介绍new、delete、mallocfree之间的关系?【北上广深杭大厂编程面试题】C++篇…这里介绍new、delete、mallocfree之间的关系?文章目录【北上广深杭大厂编程面试题】C++篇...这里介绍new、delete、mallocfree之间的关系?前言1.`malloc`和`free``malloc`(MemoryAllocation
pycdc 安装和配置指南
左洋蔷Rory
pycdc安装和配置指南pycdcC++pythonbytecodedisassembleranddecompiler项目地址:https://gitcode.com/gh_mirrors/py/pycdc1.项目基础介绍和主要的编程语言项目名称:pycdc项目简介:pycdc是一个用C++编写的Python字节码反编译器和反汇编器。它的目标是帮助开发者将编译后的Python字节码(.pyc文件)
Selenium使用指南
程序员杰哥
selenium 测试工具 python 测试用例 职场和发展 程序人生 功能测试
概述selenium是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等。官网地址为:相对于另外一款web自动化测试工具QTP来说有如下优点:免费开源轻量级,不同语言只需要一个体积很小的依赖包支持多种系统,包括Windows,Mac,Linux支持多种浏览器,包括Chrome,FireFox,IE,safari,opera等支持多语言,包括Java,C,python,c#等主流
查看opencv版本信息
zhanghui9020
在VS2010中编写控制台C++程序:#include#include"cv.h"usingnamespacestd;main(){cout<<CV_VERSION;}运行即可打印安装的opencv的版本信息
《剑指 Offer》专项突破版 - 面试题 56 : 二叉搜索树中两节点的值之和(详解 C++ 实现的两种方法)
melonyzzZ
数据结构 算法 c++ 开发语言 数据结构 面试
目录前言一、利用哈希表二、应用双指针前言题目链接:LCR056.两数之和IV-输入二叉搜索树-力扣(LeetCode)题目:给定一棵二叉搜索树和一个值k,请判断该二叉搜索树中是否存在值之和等于k的两个节点。假设二叉搜索树中节点的值均唯一。例如,在下图所示的二叉搜索树中,存在值之和等于12的两个节点(节点5和节点7),但不存在值之和为22的两个节点。分析:解决这个问题自然需要遍历二叉树中的所有节点,
咱们一起学C++ 第二百三十三篇之C++容器类与模板的探索
一杯年华@编程空间
咱们一起学习C++ c++ 开发语言 spring boot struts
咱们一起学C++第二百三十三篇之C++容器类与模板的探索大家好!C++作为一门强大的编程语言,容器类和模板是其中非常重要的特性。今天咱们就一起来深入学习这两个知识点,希望能和大家一起进步,让我们在C++编程的道路上走得更远!一、容器类的重要性与实际应用场景在C++编程中,容器类扮演着至关重要的角色。我们在编写程序时,经常会遇到需要处理大量数据或者管理多个对象的情况。比如开发一个学生信息管理系统,需
堆和栈的区别
凌云行者
操作系统 堆 栈 操作系统
堆和栈不同点:内存分配方式不同:栈:栈上的内存是自动分配和释放的,通常用于存储函数调用过程中的局部变量、调用参数和使用的寄存器状态等信息。堆:堆上的内存是动态分配的,程序在运行时可以根据需要分配和释放内存。在C++中可以通过new/new[]分配堆内存,使用delete/delete[]释放堆内存。在C中可以使用malloc、calloc和realloc函数分配堆内存,使用free函数释放堆内存内
QT 周期性的杀死一个进程(软件),一分钟后自动退出
Mr.Wang809
QT qt 开发语言
1.原因:某软件开机自启动很烦,搞一个程序干掉这个自启动的软件2.QT代码main.cpp#include"KillXXX.h"#includeintmain(intargc,char*argv[]){QApplicationa(argc,argv);KillXXXk;returna.exec();}KillXXX.h#includeclassKillXXX:publicQObject{Q_OBJ
C++ STL容器大全 string vector stack queue list priority_queue set map pair
luckyyunji
C++ 数据结构 c++
数据结构(容器)string类Vectorvector向量->不定长数组#include定义vector方法一vectorv1;vector>v2;vector>>v3;方法二vectorv1(5,10);vector>v2(5,vector(5,10));vector>>v3(5,vector(5,vector(5,10)))尾插尾删尾插v.push_back(123);尾删v.pop_back
c++中的string、vector、list、stack、set、map等常用STL容器总结
子春_贰叁
C++ c++ stl
文章目录string类vectorliststackqueuepriority_queue(优先级队列)deque(双端队列)setmultisetmapunordered_mapstring类string类简介:1.string类是表示字符串的字符串类2.string在底层实际是:basic_string模板类的别名,typedefbasic_stringstring3.不能操作多字节或者变长字
【c++】容器:vector、list、map
大姨妈V
c++ 【c++从入门到精通】学习笔记
【c++】容器1.容器2.顺序容器3.向量4.双向链表5.关联容器6.映射参考:《c++从入门到精通》人民邮电出版社标准模板库STL的c++最有特色、最实用的部分之一。标准模板库包含了容器类、迭代器和算法三部分。容器:容器就是可以用于存放各种类型数据的数据结构。迭代器:迭代器可依次存取容器中的元素,在C++中称迭代器为指针,它们提供了访问容器、序列中每个元素的方法。算法:是用来操作容器中的元素的函
labelme汉化以及打包为.exe
xxbghh
python 开发语言 后端
刚接触python,记录一下自己的安装过程以及遇到的问题。一,安装labelme下载anaconda一直点击下一步安装,安装完成后在开始菜单找到AnacondaPrompt(anaconda3)并打开,运行下列代码condacreate-nlabelme_py27python=2.7condaactivatelabelme_py27condainstallpyqtpipinstalllabelme
win11 labelme 汉化菜单
不喝可乐_
python 开发语言
替换app.py,再重启#labelme汉化菜单#-*-coding:utf-8-*-importfunctoolsimportosimportos.pathasospimportreimportwebbrowserimportimgvizfromqtpyimportQtCorefromqtpy.QtCoreimportQtfromqtpyimportQtGuifromqtpyimportQtWi
C++ 中的运算符优先级
Sirius·Black
C++专栏 精品文章 开发语言 c++
C++中的运算符优先级运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。例如x=7+3*2,在这里,x被赋值为13,而不是20,因为运算符*具有比+更高的优先级,所以首先计算乘法3*2,然后再加上7。下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的
【C++】:STL详解 —— string类
-元清-
重制C++版 c++ 开发语言
目录string的概念string的构造函数string的大小size()和length()empty()string的插入push_back函数insert函数string的删除pop_back函数(C++11)erase函数clear函数string的拼接+=运算符append()函数string的替换replace()函数string的查找find()函数rfind()函数string的比较
C++中的线程同步方式
凌云行者
C++ c++ 线程同步 互斥锁 条件变量 信号量 屏障 原子类型
线程同步方式互斥锁概述:用于保护临界区,确保同一时间只有一个线程可以访问共享资源。常见的互斥锁有std::mutex,std::lock_guard和std::unique_lockmutex概述:用于管理多个线程对共享资源的互斥访问,防止数据竞争和并发问题基础用法示例:#include#include#includeintcnt=0;//共享变量资源std::mutexmtx;//共享变量的互斥
第十二届蓝桥杯 2021年省赛真题 (C/C++ 大学C组) 第一场
肖有量
蓝桥杯 c/c++
蓝桥杯2021年省赛真题(C/C++大学C组)#AASC#B空间#C卡片#D相乘#E路径#F时间显示#G最少砝码#H杨辉三角形#I左孩子右兄弟#J括号序列解析移步对应Java组的题解。#AASC本题总分:555分问题描述 已知大写字母AAA的ASCII\mathrm{ASCII}ASCII码为656565,请问大写字母LLL的ASCII\mathrm{ASCII}ASCII码是多少?答案提交
std::unique_lock<std::mutex> lock(_mutexSwathDone);
Ring__Rain
c++
std::unique_locklock(_mutexSwathDone);是C++中用于管理互斥锁(mutex)的常见用法。以下是详细解析:1.代码作用std::mutex:这是C++标准库中的互斥锁类,用于保护共享资源,防止多线程同时访问导致数据竞争。std::unique_lock:这是一个RAII(资源获取即初始化)风格的锁管理类,用于自动管理互斥锁的加锁和解锁。这行代码的作用是:在构造l
C++ Lambda表达式
Ring__Rain
c++ 开发语言
autois_small_size=[this,&cu,ker](constContour&contour)->bool{这段代码是C++中的lambda表达式(匿名函数)。Lambda表达式是C++11引入的特性,用于定义匿名函数对象,可以直接在代码中使用。Lambda表达式,并结合生活场景和实际代码例子,让你彻底搞懂它是什么、怎么用、为什么好用1、Lambda是什么?通俗比喻:Lambda就像
[总结] 音视频开发工程师之路
二进制怪兽
音视频 音视频
前言音视频开发是一个涉及多个技术领域的复杂方向,涵盖了音频处理、视频渲染、编解码技术、流媒体传输等多个方面。以下是一个简要的学习路线指南,帮助你逐步掌握音视频开发的核心技能。基础知识计算机科学基础:掌握操作系统、计算机网络、数据结构和算法等基础知识。数学基础:了解傅里叶变换、线性代数、信号处理等数学知识,这些是音视频编-解码和处理的基石。编程语言:熟练掌握C/C++,这是音视频开发中最常用的语言;
如何使用qt开发一个xml发票浏览器,实现按发票样式显示
zhencon-com
qt xml c++ python 经验分享 学习 金融
使用Qt开发一个按发票样式显示的XML发票浏览器,如下图所示样式:一、需求:1、按税务发票样式显示。2、拖入即可显示。3、正确解析xml文件。二、实现可以按照以下步骤进行:1.创建Qt项目打开QtCreator,创建一个新的QtWidgetsApplication项目。设置项目名称和路径,选择合适的Qt版本。2.导入必要的模块在项目的.pro文件中,确保导入了xml模块,以便使用Qt的XML解析功
如何让C++程序自动生成dump文件?以及如何分析dump文件?
dvlinker
C/C++实战专栏 C/C++软件开发从入门到实战 c++ 生成dump文件 windbg 分析dump文件
目录1、API函数SetUnhandledExceptionFilter介绍2、调用SetUnhandledExceptionFilter设置异常处理函数3、调用MiniDumpWriteDump函数导出包含异常上下文的dump文件4、dump文件的多种生成方式5、使用Windbg分析dump文件6、最后C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https:/
c/c++蓝桥杯经典编程题100道(22)最短路径问题
tamak
算法 数据结构 图论 c语言 c++ 蓝桥杯
最短路径问题->返回c/c++蓝桥杯经典编程题100道-目录目录最短路径问题一、题型解释二、例题问题描述三、C语言实现解法1:Dijkstra算法(正权图,难度★★)解法2:Bellman-Ford算法(含负权边,难度★★★)四、C++实现解法1:Dijkstra算法(优先队列优化,难度★★☆)解法2:Floyd-Warshall算法(多源最短路径,难度★★★)五、总结对比表六、特殊方法与内置函数
C++中memset函数的用法
MatthewMao
C++使用积累 C语言使用积累 C++ memset函数 初始化字符串或
//复习数组的时候,第一次见到了memset,学之。memset:char型初始化函数头文件:或函数原型:void*memset(void*s,intch,size_tn)memset(结构体/数组名,用于替换的ASCII码对应字符,前n个字符);memset(结构体/数组名,"用于替换的字符“,前n个字符);函数解释:将s中的前n个字节用ch替换并且返回s函数作用:在一段内存块中填充某一个给定的
《大话设计模式》学习记录
MatthewMao
设计模式 c++ 设计模式
转载地址:1.理论支持1:https://www.cnblogs.com/ygsworld/p/10647954.html2.理论支持2:小菜编程成长记系列-伍迷-博客园前言:设计模式系列是参照IT前辈-程杰编写的《大话设计模式》的内容而来,由于其实现内容是按照依据.NetFramwork的C#来实现的,而我是搞C++,所以我想着用C++的知识将书上相应的例子来实现一遍,不过学习之前,得明确一下:
C++ 设计模式-代理模式
ox0080
# 北漂+滴滴出行 C++设计模式 VIP 激励 c++ 设计模式 代理模式
远程代理(RemoteProxy)示例假设有一个服务器应用程序,该应用程序提供了一个服务,比如获取用户信息。客户端直接访问远程对象可能很复杂,因此可以使用代理对象来简化这个过程。代理对象将请求转发给远程对象,远程对象负责真正的服务逻辑。设计:Subject:定义了客户端和代理对象以及真实对象都共享的接口。RealSubject:实现了具体的服务操作,比如从远程数据库获取数据。Proxy:在客户端和
在make编译时,出现C++: fatal error:已杀死 signal terminated program cc1plus,解决办法
太想进步了~
c++ 开发语言
在make编译时,出现C++:fatalerror:已杀死signalterminatedprogramcc1plus,如下图所示:出现上述问题,可以考虑是虚拟机内存不足,可以采用swap分区的方式解决。具体命令是:(1)主目录下创建分区路径(直接用“ctrl+ALT+T打开terminal,运行下面命令”)sudomkdir-p/var/cache/swap/(2)设置分区的大小(不唯一)bs=
C/C++Win32编程基础详解视频下载
择善Zach
编程 C++ Win32
课题视频:C/C++Win32编程基础详解
视频知识:win32窗口的创建
windows事件机制
主讲:择善Uncle老师
学习交流群:386620625
验证码:625
--
Guava Cache使用笔记
bylijinnan
java guava cache
1.Guava Cache的get/getIfPresent方法当参数为null时会抛空指针异常
我刚开始使用时还以为Guava Cache跟HashMap一样,get(null)返回null。
实际上Guava整体设计思想就是拒绝null的,很多地方都会执行com.google.common.base.Preconditions.checkNotNull的检查。
2.Guava
解决ora-01652无法通过128(在temp表空间中)
0624chenhong
oracle
解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅了oracle的错误代码说明:意思是指temp表空间无法自动扩展temp段。这种问题一般有两种原因:一是临时表空间空间太小,二是不能自动扩展。
分析过程:
既然是temp表空间有问题,那当
Struct在jsp标签
不懂事的小屁孩
struct
非UI标签介绍:
控制类标签:
1:程序流程控制标签 if elseif else
<s:if test="isUsed">
<span class="label label-success">True</span>
</
按对象属性排序
换个号韩国红果果
JavaScript 对象排序
利用JavaScript进行对象排序,根据用户的年龄排序展示
<script>
var bob={
name;bob,
age:30
}
var peter={
name;peter,
age:30
}
var amy={
name;amy,
age:24
}
var mike={
name;mike,
age:29
}
var john={
大数据分析让个性化的客户体验不再遥远
蓝儿唯美
数据分析
顾客通过多种渠道制造大量数据,企业则热衷于利用这些信息来实现更为个性化的体验。
分析公司Gartner表示,高级分析会成为客户服务的关键,但是大数据分析的采用目前仅局限于不到一成的企业。 挑战在于企业还在努力适应结构化数据,疲于根据自身的客户关系管理(CRM)系统部署有效的分析框架,以及集成不同的内外部信息源。
然而,面对顾客通过数字技术参与而产生的快速变化的信息,企业需要及时作出反应。要想实
java笔记4
a-john
java
操作符
1,使用java操作符
操作符接受一个或多个参数,并生成一个新值。参数的形式与普通的方法调用不用,但是效果是相同的。加号和一元的正号(+)、减号和一元的负号(-)、乘号(*)、除号(/)以及赋值号(=)的用法与其他编程语言类似。
操作符作用于操作数,生成一个新值。另外,有些操作符可能会改变操作数自身的
从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
aijuans
嵌入式学习
笔者学习嵌入式Linux也有一段时间了,很奇怪的是很多书讲驱动编程方面的知识,也有很多书将ARM9方面的知识,但是从以前51形式的(对寄存器直接操作,初始化芯片的功能模块)编程方法,和思维模式,变换为基于Linux操作系统编程,讲这个思想转变的书几乎没有,让初学者走了很多弯路,撞了很多难墙。
笔者因此写上自己的学习心得,希望能给和我一样转变
在springmvc中解决FastJson循环引用的问题
asialee
循环引用 fastjson
我们先来看一个例子:
package com.elong.bms;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import co
ArrayAdapter和SimpleAdapter技术总结
百合不是茶
android SimpleAdapter ArrayAdapter 高级组件基础
ArrayAdapter比较简单,但它只能用于显示文字。而SimpleAdapter则有很强的扩展性,可以自定义出各种效果
ArrayAdapter;的数据可以是数组或者是队列
// 获得下拉框对象
AutoCompleteTextView textview = (AutoCompleteTextView) this
九封信
bijian1013
人生 励志
有时候,莫名的心情不好,不想和任何人说话,只想一个人静静的发呆。有时候,想一个人躲起来脆弱,不愿别人看到自己的伤口。有时候,走过熟悉的街角,看到熟悉的背影,突然想起一个人的脸。有时候,发现自己一夜之间就长大了。 2014,写给人
Linux下安装MySQL Web 管理工具phpMyAdmin
sunjing
PHP Install phpMyAdmin
PHP http://php.net/
phpMyAdmin http://www.phpmyadmin.net
Error compiling PHP on CentOS x64
一、安装Apache
请参阅http://billben.iteye.com/admin/blogs/1985244
二、安装依赖包
sudo yum install gd
分布式系统理论
bit1129
分布式
FLP
One famous theory in distributed computing, known as FLP after the authors Fischer, Lynch, and Patterson, proved that in a distributed system with asynchronous communication and process crashes,
ssh2整合(spring+struts2+hibernate)-附源码
白糖_
eclipse spring Hibernate mysql 项目管理
最近抽空又整理了一套ssh2框架,主要使用的技术如下:
spring做容器,管理了三层(dao,service,actioin)的对象
struts2实现与页面交互(MVC),自己做了一个异常拦截器,能拦截Action层抛出的异常
hibernate与数据库交互
BoneCp数据库连接池,据说比其它数据库连接池快20倍,仅仅是据说
MySql数据库
项目用eclipse
treetable bug记录
braveCS
table
// 插入子节点删除再插入时不能正常显示。修改:
//不知改后有没有错,先做个备忘
Tree.prototype.removeNode = function(node) {
// Recursively remove all descendants of +node+
this.unloadBranch(node);
// Remove
编程之美-电话号码对应英语单词
bylijinnan
java 算法 编程之美
import java.util.Arrays;
public class NumberToWord {
/**
* 编程之美 电话号码对应英语单词
* 题目:
* 手机上的拨号盘,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,
* 要求对一段数字,输出其代表的所有可能的字母组合
jquery ajax读书笔记
chengxuyuancsdn
jQuery ajax
1、jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()
JWFD工作流拓扑结构解析伪码描述算法
comsci
数据结构 算法 工作 活动 J#
对工作流拓扑结构解析感兴趣的朋友可以下载附件,或者下载JWFD的全部代码进行分析
/* 流程图拓扑结构解析伪码描述算法
public java.util.ArrayList DFS(String graphid, String stepid, int j)
oracle I/O 从属进程
daizj
oracle
I/O 从属进程
I/O从属进程用于为不支持异步I/O的系统或设备模拟异步I/O.例如,磁带设备(相当慢)就不支持异步I/O.通过使用I/O 从属进程,可以让磁带机模仿通常只为磁盘驱动器提供的功能。就好像支持真正的异步I/O 一样,写设备的进程(调用者)会收集大量数据,并交由写入器写出。数据成功地写出时,写入器(此时写入器是I/O 从属进程,而不是操作系统)会通知原来的调用者,调用者则会
高级排序:希尔排序
dieslrae
希尔排序
public void shellSort(int[] array){
int limit = 1;
int temp;
int index;
while(limit <= array.length/3){
limit = limit * 3 + 1;
初二下学期难记忆单词
dcj3sjt126com
english word
kitchen 厨房
cupboard 厨柜
salt 盐
sugar 糖
oil 油
fork 叉;餐叉
spoon 匙;调羹
chopsticks 筷子
cabbage 卷心菜;洋白菜
soup 汤
Italian 意大利的
Indian 印度的
workplace 工作场所
even 甚至;更
Italy 意大利
laugh 笑
m
Go语言使用MySQL数据库进行增删改查
dcj3sjt126com
mysql
目前Internet上流行的网站构架方式是LAMP,其中的M即MySQL, 作为数据库,MySQL以免费、开源、使用方便为优势成为了很多Web开发的后端数据库存储引擎。MySQL驱动Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的实现接口,常用的有如下几种:
http://code.google.c...o-mysql-dri
git命令
shuizhaosi888
git
---------------设置全局用户名:
git config --global user.name "HanShuliang" //设置用户名
git config --global user.email "
[email protected] " //设置邮箱
---------------查看环境配置
git config --li
qemu-kvm 网络 nat模式 (四)
haoningabc
kvm qemu
qemu-ifup-NAT
#!/bin/bash
BRIDGE=virbr0
NETWORK=192.168.122.0
GATEWAY=192.168.122.1
NETMASK=255.255.255.0
DHCPRANGE=192.168.122.2,192.168.122.254
TFTPROOT=
BOOTP=
function check_bridge()
不要让未来的你,讨厌现在的自己
jingjing0907
生活 奋斗 工作 梦想
故事one
23岁,他大学毕业,放弃了父母安排的稳定工作,独闯京城,在家小公司混个小职位,工作还算顺手,月薪三千,混了混,混走了一年的光阴。 24岁,有了女朋友,从二环12人的集体宿舍搬到香山民居,一间平房,二人世界,爱爱爱。偶然约三朋四友,打扑克搓麻将,日子快乐似神仙; 25岁,出了几次差,调了两次岗,薪水涨了不过百,生猛狂飙的物价让现实血淋淋,无力为心爱银儿购件大牌
枚举类型详解
一路欢笑一路走
enum 枚举详解 enumset enumMap
枚举类型详解
一.Enum详解
1.1枚举类型的介绍
JDK1.5加入了一个全新的类型的”类”—枚举类型,为此JDK1.5引入了一个新的关键字enum,我们可以这样定义一个枚举类型。
Demo:一个最简单的枚举类
public enum ColorType {
RED
第11章 动画效果(上)
onestopweb
动画
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
Eclipse中jsp、js文件编辑时,卡死现象解决汇总
ljf_home
eclipse jsp卡死 js卡死
使用Eclipse编辑jsp、js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲。将所有用过的方法罗列如下:
1、取消验证
windows–>perferences–>validation
把 除了manual 下面的全部点掉,build下只留 classpath dependency Valida
MySQL编程中的6个重要的实用技巧
tomcat_oracle
mysql
每一行命令都是用分号(;)作为结束
对于MySQL,第一件你必须牢记的是它的每一行命令都是用分号(;)作为结束的,但当一行MySQL被插入在PHP代码中时,最好把后面的分号省略掉,例如:
mysql_query("INSERT INTO tablename(first_name,last_name)VALUES('$first_name',$last_name')");
zoj 3820 Building Fire Stations(二分+bfs)
阿尔萨斯
Build
题目链接:zoj 3820 Building Fire Stations
题目大意:给定一棵树,选取两个建立加油站,问说所有点距离加油站距离的最大值的最小值是多少,并且任意输出一种建立加油站的方式。
解题思路:二分距离判断,判断函数的复杂度是o(n),这样的复杂度应该是o(nlogn),即使常数系数偏大,但是居然跑了4.5s,也是醉了。 判断函数里面做了3次bfs,但是每次bfs节点最多