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客户端封装的更多相关文章

  1. C# 对 TCP 客户端的状态封装

    TCP客户端连接TCP服务器端有几种应用状态: 与服务器的连接已建立 与服务器的连接已断开 与服务器的连接发生异常 应用程序可按需求合理处理这些逻辑,比如: 连接断开后自动重连 连接断开后选择备用地址 ...

  2. android 之TCP客户端编程

    补充,由于这篇文章是自己入门的时候写的,随着Android系统的升级可能有发送需要在任务 中进行,如有问题请百度 thread 或者看下面链接的文章 https://www.cnblogs.com/y ...

  3. TCP客户端图片上传服务端保存本地示例

    //TCP客户端public class TCPClient { public static void main(String[] args)throws IOException { Socket s ...

  4. linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现

    1 TCP简介 tcp是一种基于流的应用层协议,其“可靠的数据传输”实现的原理就是,“拥塞控制”的滑动窗口机制,该机制包含的算法主要有“慢启动”,“拥塞避免”,“快速重传”. 2 TCP socket ...

  5. python网络编程socketserver模块(实现TCP客户端/服务器)

    摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...

  6. 29-ESP8266 SDK开发基础入门篇--编写TCP 客户端程序(Lwip RAW模式,非RTOS版,精简入门)

    https://www.cnblogs.com/yangfengwu/p/11456667.html 由于上一节的源码长时间以后会自动断开,所以再做这一版非RTOS版的,咱直接用lua源码里面别人写的 ...

  7. TCP 客户端编程

    1.Qt中TCP客户端编程 对Qt编程而言,网络只是数据传输的通道: Qt提供了QTcpSocket类(封装了TCP协议细节): 将QTcpSocket的对象当做黑盒使用,进行数据首发. 1.1QTc ...

  8. Python TCP客户端

    import socket target_host="www.baidu.com" target_port=80 # 建立一个socket对象 client=socket.sock ...

  9. Java网络编程(TCP客户端)

    TCP传输:两个端点建立连接后会有一个传输数据的通道,这个通道就称为流,而且是建立在网络基础上的流,之为socket流,该流中既可以读取也可以写入. TCP的两个端点:一个客户端:ServerSock ...

随机推荐

  1. react native中使用 react-native-easy-toast 和react-native-htmlview

    第一步,下载依赖 npm install react-native-htmlview --save npm install react-native-easy-toast --save 第二步,引入 ...

  2. codeforces 185A Plant(推公式)

    Plant [题目链接]Plant [题目类型]推公式 &题解: 这个是可以推公式的: 每年的总个数是4^n个,设n年时向上的个数是x个,向下的个数是y个,那么n+1年时,向上的个数是3* x ...

  3. Jenkins. 安装过程中出现一个错误: No such plugin: cloudbees-folder

    安装过程中出现一个错误: No such plugin: cloudbees-folder 安装插件,有时候会报类似的错误:An error occurred during installation: ...

  4. 004-全局应用程序类Global.asax

    服务器对象:Request.Response.Server.Session.Application.Cookie //功能1:为服务器对象注册Start.End处理 protected void Ap ...

  5. 002-一般处理程序(HttpHandler)

    一般处理程序(HttpHandler):是一个实现System.Web.IHttpHandler接口的特殊类.任何一个实现了IHttpHandler接口的类,是作为一个外部请求的目标程序的前提.(凡是 ...

  6. c#基础思维导图

  7. <3>lua字符串

    1.字符串 <1>字符串相连/加法   .. local str = "abc" str = str .. 7 --字符串与数字相连 print(str) --abc7 ...

  8. Nginx配置基础-location

    location表达式类型 ~ 表示执行一个正则匹配,区分大小写~* 表示执行一个正则匹配,不区分大小写^~ 表示普通字符匹配.使用前缀匹配.如果匹配成功,则不再匹配其他location.= 进行普通 ...

  9. (Review cs231n) Gradient Calculation and Backward

    ---恢复内容开始--- 昨日之补充web. 求解下图的梯度的流动,反向更新参数的过程,表示为 输入与损失梯度的关系,借助链式法则,当前输入与损失之间的梯度关系为局部梯度乘以后一层的梯度. ---恢复 ...

  10. 自学Java第五周的总结

    在这周里我在我要自学网上观看视频学习了有关java的基础知识,课程主要介绍JavaSE,这是整个Java体系的基础:课程将由浅入深,并结合案例进行讲解,在那里我将自己已学的知识进行了巩固,并由学习到了 ...