tcp客户端封装
1、头文件
#ifndef TCPCLIENT_H
#define TCPCLIENT_H #include <QTcpSocket> class TcpClient : public QObject
{
Q_OBJECT public:
TcpClient(QObject *parent);
~TcpClient(); private:
QTcpSocket* tcpClient = NULL;//tcp客户端
private slots:
void openSlot(QString ipStr,quint16 port);//连接服务器槽函数
void rcvSlot();//接收数据槽函数
void sendSlot(QByteArray ba);//发送数据槽函数
void closeSlot();//关闭连接槽函数
void tcpStateChangeSlot(QAbstractSocket::SocketState socketState);//TCP状态变化槽函数
signals:
void tcpStateSignal(QString info);//向外发出的调试信息
void tcpConnectSignal(bool ok);//连接成功信号
void getPacketSignal(int type, QByteArray ba);//tcp将不同的包发出去
}; #endif // TCPCLIENT_H
2、源文件
#include "tcpclient.h"
#pragma execution_character_set("utf-8")
TcpClient::TcpClient(QObject *parent)
: QObject(parent)
{ } TcpClient::~TcpClient()
{ } /*****************************************************************/
//作者:朱小勇
//函数名称:连接服务器槽函数
//函数参数:NULL
//函数返回值:NULL
//函数作用:NULL
//备注:NULL
/*****************************************************************/
void TcpClient::openSlot(QString ipStr, quint16 port)
{
if (NULL == tcpClient)
{
tcpClient = new QTcpSocket();
QObject::connect(this->tcpClient, SIGNAL(readyRead()), this, SLOT(rcvSlot()));//接收数据信号槽
QObject::connect(tcpClient, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(tcpStateChangeSlot(QAbstractSocket::SocketState)));//状态变化信号槽
}if (tcpClient->isOpen())
{
return;
}
tcpClient->connectToHost(ipStr, port);//连接服务器
} /*****************************************************************/
//作者:朱小勇
//函数名称:接收数据槽函数
//函数参数:NULL
//函数返回值:NULL
//函数作用:NULL
//备注:NULL
/*****************************************************************/
void TcpClient::rcvSlot()
{
static QByteArray allBa;//用来存所有文件
allBa.append(tcpClient->readAll());//读取数据
int head = allBa.indexOf(HEAD);//报文头的位置
uint16_t length = ;//存长度字节
QByteArray currentBa;
int id = ;
while (- != head)
{
allBa = allBa.mid(head);//去掉报头之前的
memcpy(&length, allBa.data() + , );
if (allBa.size() >= length)//长度够,进行解析
{
currentBa = allBa.mid(, length);//获取当前完成包
id = Mymethod::getPacketType(currentBa);
if (- != id)
{
emit getPacketSignal(id, currentBa);
qDebug() << "接收指令:" << currentBa.toHex().toUpper();
}
allBa = allBa.mid();
}
else
{
break;
}
head = allBa.indexOf(HEAD);//刷新报文头的位置
}
}
/*****************************************************************/
//作者:朱小勇
//函数名称:关闭连接
//函数参数:NULL
//函数返回值:NULL
//函数作用:NULL
//备注:NULL
/*****************************************************************/
void TcpClient::closeSlot()
{
if (NULL != tcpClient)
tcpClient->close();
} /*****************************************************************/
//作者:朱小勇
//函数名称:发送数据
//函数参数:NULL
//函数返回值:NULL
//函数作用:NULL
//备注:NULL
/*****************************************************************/
void TcpClient::sendSlot(QByteArray ba)
{
if ((NULL == tcpClient) || (!tcpClient->isOpen()))
{
emit tcpStateSignal("未连接至服务器,发送请求失败!!!");
return;
}
if (ba.size() != tcpClient->write(ba))
{
emit tcpStateSignal("发送请求失败!!!");
}
else
{
emit tcpStateSignal("成功发送请求...");
}
} /*****************************************************************/
//作者:朱小勇
//函数名称:状态变化槽函数
//函数参数:NULL
//函数返回值:NULL
//函数作用:NULL
//备注:NULL
/*****************************************************************/
void TcpClient::tcpStateChangeSlot(QAbstractSocket::SocketState socketState)
{
if (QAbstractSocket::ConnectedState == socketState)
{
emit tcpStateSignal("成功连接至服务器...");
emit tcpConnectSignal(true);
}
else if (QAbstractSocket::ConnectingState == socketState)
{
emit tcpStateSignal("正在寻找服务器...");
}
else if (QAbstractSocket::UnconnectedState == socketState)
{
emit tcpStateSignal("断开连接!!!");
emit tcpConnectSignal(false);
}
}
tcp客户端封装的更多相关文章
- C# 对 TCP 客户端的状态封装
TCP客户端连接TCP服务器端有几种应用状态: 与服务器的连接已建立 与服务器的连接已断开 与服务器的连接发生异常 应用程序可按需求合理处理这些逻辑,比如: 连接断开后自动重连 连接断开后选择备用地址 ...
- android 之TCP客户端编程
补充,由于这篇文章是自己入门的时候写的,随着Android系统的升级可能有发送需要在任务 中进行,如有问题请百度 thread 或者看下面链接的文章 https://www.cnblogs.com/y ...
- TCP客户端图片上传服务端保存本地示例
//TCP客户端public class TCPClient { public static void main(String[] args)throws IOException { Socket s ...
- linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现
1 TCP简介 tcp是一种基于流的应用层协议,其“可靠的数据传输”实现的原理就是,“拥塞控制”的滑动窗口机制,该机制包含的算法主要有“慢启动”,“拥塞避免”,“快速重传”. 2 TCP socket ...
- python网络编程socketserver模块(实现TCP客户端/服务器)
摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...
- 29-ESP8266 SDK开发基础入门篇--编写TCP 客户端程序(Lwip RAW模式,非RTOS版,精简入门)
https://www.cnblogs.com/yangfengwu/p/11456667.html 由于上一节的源码长时间以后会自动断开,所以再做这一版非RTOS版的,咱直接用lua源码里面别人写的 ...
- TCP 客户端编程
1.Qt中TCP客户端编程 对Qt编程而言,网络只是数据传输的通道: Qt提供了QTcpSocket类(封装了TCP协议细节): 将QTcpSocket的对象当做黑盒使用,进行数据首发. 1.1QTc ...
- Python TCP客户端
import socket target_host="www.baidu.com" target_port=80 # 建立一个socket对象 client=socket.sock ...
- Java网络编程(TCP客户端)
TCP传输:两个端点建立连接后会有一个传输数据的通道,这个通道就称为流,而且是建立在网络基础上的流,之为socket流,该流中既可以读取也可以写入. TCP的两个端点:一个客户端:ServerSock ...
随机推荐
- webpack使用六
插件(Plugins) 插件(Plugins)是用来拓展Webpack功能的,它们会在整个构建过程中生效,执行相关的任务. Loaders和Plugins常常被弄混,但是他们其实是完全不同的东西,可以 ...
- UVA 11178 Morley's Theorem(几何)
Morley's Theorem [题目链接]Morley's Theorem [题目类型]几何 &题解: 蓝书P259 简单的几何模拟,但要熟练的应用模板,还有注意模板的适用范围和传参不要传 ...
- 关于oracle中的数字类型
1.关于number类型. 以下是从其文档中摘录出的一句话: p is the precision, or the total number of significant decimal digits ...
- Python记录7:函数3,函数对象
#函数对象指的是:函数的内存地址可以像变量值一样去使用,如何使用?def func(): print('from func')#1. 可以被引用# f=func# print(f)# f() #2. ...
- sitecore系列教程之如何以编程方式将访客数据关联到联系人卡片
在我之前关于Sitecore体验资料的帖子中,我们看到了我们如何了解访问者的一切,包括访问他们在访问期间触发的事件.在这篇博客文章中,我将引导您完成识别匿名用户并将用户访问与联系人记录联系起来的过 ...
- java 使用jacob把word转pdf
一.使用前要下载必要包及文件 链接: https://pan.baidu.com/s/1nvutQxb 密码: qgpi 二.引包和dll文件 1.引包:eclipse引包就不用说了,idea引包步骤 ...
- 定时调度任务quartz
依赖 <!-- quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> < ...
- modelsim仿真正确FPGA运行不正确的可能原因 - cm4写寄存器错
困住整整一周了,工作进行不下去,中午偶遇导师,指导意见是有两种可能: 1. FPGA编译器优化代码,可以考虑把综合过程中所有的warning排查一下 2. verilog里有不可综合的语句. 又及 ...
- 网关绑定命令,解决arp攻击
一般家里的宽带都采用ADSL设备,通过固定IP地址接入Internet,但是经常会出现断网的现象,那么如何通过ARP命令绑定默认网关来解决这个问题呢? 工具/原料 ARP命令 CMD命令提示符 方法/ ...
- 使用yaml+groovy实现Java代码可配置化
背景与目标 在使用函数接口和枚举实现配置式编程(Java与Scala实现),使用了函数接口和枚举实现了配置式编程.读者可先阅读此文,再来阅读本文. 有时,需要将一些业务逻辑,使用配置化的方式抽离出来, ...