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. webpack使用六

    插件(Plugins) 插件(Plugins)是用来拓展Webpack功能的,它们会在整个构建过程中生效,执行相关的任务. Loaders和Plugins常常被弄混,但是他们其实是完全不同的东西,可以 ...

  2. SqlServer表和EXCEL数据互相复制方法

    一.SqlServer表数据复制到excel 1.新建查询,用sql语句把表数据读出来 2.然后,选择数据,右键,复制(也可以点击连同标题复制),复制到记事本中(不然会乱码) 3.然后再把记事本的内容 ...

  3. Struts2自定义Field级别的错误提示信息

    自定义Field级别的错误提示信息步骤: 在action包中新建一个以Action命名的properties文件,如:RegisterAction.properties 2. 然后在该属性文件中指定每 ...

  4. eclipse中tomcat启动成功,浏览器访问失败

    eclipse添加tomcat之后,tomcat有个默认设置,我们需要对tomcat进行重新设置: 1.双击已添加的tomcat,进入到配置页面,找到server locations一栏,可以看到默认 ...

  5. Unity shader学习之逐像素漫反射光照模型

    shader如下: Shader "Custom/Diffuse Fragment-Level" { Properties { _Diffuse (,,,) } SubShader ...

  6. 向量体系结构(2)----SIMD指令集扩展和GPU

    进行SIMD多媒体扩展的设计,源于一个很容易观察到的事实: 许多多媒体应用程序操作的数据类型比对32位处理器进行针对性优化的数据类型更窄一些. 图像三基色,都是8位.音频采样也都是8位和16位来表示. ...

  7. 【Linux学习三】VI/VIM全屏文本编辑器

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.打开关闭文件打开文件:vim /path/to/somefilev ...

  8. flask模板应用-自定义错误页面

    自定义错误页面 当程序返回错误响应时,会渲染一个默认的错误页面,我们可以注册错误处理函数来处理错误页面 错误处理函数和视图函数很相似,返回值将作为响应的主题,因此我们先要创建错误页面的模板文件.为了和 ...

  9. flask模板应用-加载静态文件:添加Favicon,使用CSS框架,使用宏加载静态资源

    加载静态文件 一个Web项目不仅需要HTML模板,还需要许多静态文件,比如CSS.JavaScript文件.图片和声音声.在flask程序中,默认需要将静态文件存储在与主脚本(包含程序实例的脚本)同级 ...

  10. RocketMQ最佳实战

    RocketMQ 客户端最佳实践 1. Producer最佳实践 发送消息注意事项 1). 一个应用尽可能用一个Topic,消息子类型用tags来标识,tags可以由应用自由设置. 2). 消息发送成 ...