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. Spring+SpringMVC+MyBatis整合应用

    1)搭建Spring,SpringMVC和MyBatis环境 创建一个web工程 添加MyBatis相关环境 引入数据库驱动包和DBCP连接池开发包 引入MyBatis开发包 添加Spring,Spr ...

  2. Bootstrap-常用图标glyphicon

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...

  3. Python学习记录之----网络通信(二)

    网络通信   socket 这一节太难了,还是看TA的吧 http://www.cnblogs.com/alex3714/articles/5830365.html 不能执行top等类似的 会持续输出 ...

  4. c++学习笔记(八)- map

    map<key, value>是按key排好序的,key不可以重复. 1. map.lower_bound():按key查找,如果查找的key存在,返回该位置,如果不存在返回大于所查找值的 ...

  5. Python 字典(Dictionary) values()方法

    描述 Python 字典(Dictionary) values() 函数以列表返回字典中的所有值. 语法 values()方法语法: dict.values() 参数 NA. 返回值 返回字典中的所有 ...

  6. git克隆远程项目并创建本地对应分支

    http://jingyan.baidu.com/article/19192ad83ea879e53e5707ce.html

  7. log4j日志输出使用_1

    转自https://www.cnblogs.com/sky230/p/5759831.html Log4j是帮助开发人员进行日志输出管理的API类库.它最重要的特点就可以配置文件灵活的设置日志信息的优 ...

  8. linux常用命令:mkdir 命令

    linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项] 目录... 2.命令 ...

  9. ATM取款机

    package Tests; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;impo ...

  10. Linux下输出 excel文件

    Linux下输出 excel文件 今日提供给产品需求,需excel文件,故总结要点如下: 1.默认间隔是space_20 2.修改为TAB \t _09 awk '  BEGIN { OFS=&quo ...