iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用HTTP实现文本传输
  • 272
分享到

如何使用HTTP实现文本传输

2023-06-05 03:06:43 272人浏览 安东尼
摘要

如何使用Http实现文本传输,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是WEB联网

如何使用Http实现文本传输,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是WEB联网的基础,HTTP协议是建立在tcp协议之上的一种应用。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种短连接。HTTP遵循请求(Request)/应答(Response)模型。所以一定需要实现请求(Gk8HttpRequest)。同时需要实现返回(Gk8HttpResponse)。在游戏研发编程中HTTP请求类型常用的就是GET和POST。框架设计中就需要实现完成HTTP请求和返回的Gk8HttpClient类。HTTP不管是文本传输还是二进制传输Gk8HttpClient类都能兼容完成响应的功能。HTTP文本传输方便简洁。实现轻量级通信的最佳方式。

libCurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的api接口。底层通信都是使用libCurl库来完成。具体可找相关资料和参阅相关代码。C语言封装开发的优势就是支持跨平台。windows平台,安卓平台,iOS平台。跨平台迁移代码无需再次开发。一劳永逸的解决通信问题。为了方便开发时HTTP并发和回调。又实现了Gk8httpservlet类(httpnet目录中)。高度封装的代码目的就是易于理解便于使用。

c++实现网络HTTP请求类:Gk8HttpRequest.h

#ifndef __GK8HTTPREQUEST_H__#define __GK8HTTPREQUEST_H__#pragma once#include "Gk8BaseObj.h"#include "Gk8ByteMaker.h"#include "Gk8str.h"typedef GK8_VOID (Gk8BaseObj::*HTTPREQUEST_CALLBACK_FUN)(GK8_LPVOID pHttpResponse);class Gk8HttpRequest{public:    //[定义HTTP请求类型]    typedef enum    {        kHttpGet,        kHttpPost,        kHttpUnkown,    }HttpRequestType;protected:    HttpRequestType m_eRequestType;            //[HTTP请求类型]    Gk8Str m_sHttpUrl;                        //[HTTP请求地址]    Gk8ByteMaker m_iRequestData;            //[HTTP请求数据]    Gk8BaseObj* m_pTarget;                    //[HTTP请求回调目标对象]    HTTPREQUEST_CALLBACK_FUN m_pSelector;    //[HTTP请求回调函数]public:    Gk8HttpRequest()    {        m_eRequestType=kHttpUnkown;        m_sHttpUrl.Empty();        m_iRequestData.Destroy();        m_pTarget=NULL;        m_pSelector=NULL;    };    virtual ~Gk8HttpRequest()    {        ClearRequestData();    };    inline GK8_VOID ClearRequestData()    {        m_iRequestData.Destroy();    }    inline GK8_VOID SetRequestType(HttpRequestType eRequestType)    {        m_eRequestType=eRequestType;    };    inline HttpRequestType GetRequestType()    {        return m_eRequestType;    };    inline GK8_VOID SetHttpUrl(GK8_LPCSTR lpHttpUrl)    {        m_sHttpUrl=lpHttpUrl;    };    inline GK8_LPCSTR GetHttpUrl()    {        return m_sHttpUrl;    };    inline GK8_VOID SetRequestData(Gk8ByteMaker* pRequestData)    {        pRequestData->ShiftTo(m_iRequestData);    };    inline Gk8ByteMaker* GetRequestData()    {        return &m_iRequestData;    }    inline GK8_INT GetRequestDataSize()    {        return m_iRequestData.GetStreamSize();    }    inline GK8_VOID SetResponseCallBack(Gk8BaseObj* pTarget,HTTPREQUEST_CALLBACK_FUN pSelector)    {        m_pTarget=pTarget;        m_pSelector=pSelector;    }    inline Gk8BaseObj* GetTarget()    {        return m_pTarget;    }    inline HTTPREQUEST_CALLBACK_FUN GetSelector()    {        return m_pSelector;    }};#endif

C++实现网络HTTP返回类:Gk8HttpResponse.h

#ifndef __GK8HTTPRESPONSE_H__#define __GK8HTTPRESPONSE_H__#pragma once#include "Gk8HttpRequest.h"class Gk8HttpResponse{protected:    Gk8HttpRequest* m_pHttpRequest;            //[HTTP请求类]    GK8_BOOL m_bSucceed;                    //[HTTP请求反馈成功]    Gk8ByteMaker m_iResponseData;            //[HTTP请求反馈数据]    GK8_INT m_nResponseCode;                //[HTTP请求反馈码]    Gk8Str m_sErrorBuffer;                    //[HTTP请求错误信息]protected:    GK8_BOOL InitWithRequest(Gk8HttpRequest* pHttpRequest);public:    Gk8HttpResponse(Gk8HttpRequest* pHttpRequest)    {        m_pHttpRequest=pHttpRequest;        m_bSucceed=false;        m_iResponseData.Destroy();        m_sErrorBuffer.Empty();    }    virtual ~Gk8HttpResponse()    {        if(m_pHttpRequest) delete m_pHttpRequest;        ClearResponseData();    }    inline GK8_VOID ClearResponseData()    {        m_iResponseData.Destroy();    }    inline Gk8HttpRequest* GetHttpRequest()    {        return m_pHttpRequest;    }    inline GK8_VOID SetSucceed(GK8_BOOL bSucceed)    {        m_bSucceed=bSucceed;    };    inline GK8_BOOL IsSucceed()    {        return m_bSucceed;    };    inline GK8_VOID SetResponseData(Gk8ByteMaker* pResponseData)    {        pResponseData->ShiftTo(m_iResponseData);    }    inline Gk8ByteMaker* GetResponseData()    {        return &m_iResponseData;    }    inline GK8_VOID SetResponseCode(GK8_INT nResponseCode)    {        m_nResponseCode=nResponseCode;    }    inline GK8_INT GetResponseCode()    {        return m_nResponseCode;    }    inline GK8_VOID SetErrorBuffer(GK8_LPCSTR lpErrorBuffer)    {        m_sErrorBuffer=lpErrorBuffer;    };    inline GK8_LPCSTR GetErrorBuffer()    {        return m_sErrorBuffer;    }};#endif

C++实现HTTP通信类:Gk8HttpClient.h

#ifndef __GK8HTTPCLIENT_H__#define __GK8HTTPCLIENT_H__#pragma once#include "Gk8HttpRequest.h"#include "Gk8HttpResponse.h"class Gk8HttpClient{private:    GK8_INT m_nTimeOutForConnect;        //[连接超时时间]    GK8_INT m_nTimeOutForRead;            //[读取超时时间]private:    Gk8HttpClient();    virtual ~Gk8HttpClient();    GK8_BOOL InitThreadSemphore();public:    inline GK8_VOID SetTimeoutForConnect(GK8_INT nTimeOutForConnect){m_nTimeOutForConnect=nTimeOutForConnect;};    inline GK8_INT GetTimeoutForConnect(){return m_nTimeOutForConnect;}    inline GK8_VOID SetTimeoutForRead(GK8_INT nTimeOutForRead){m_nTimeOutForRead=nTimeOutForRead;};    inline GK8_INT GetTimeoutForRead(){return m_nTimeOutForRead;};    GK8_VOID Send(Gk8HttpRequest* pHttpRequest);    GK8_VOID HttpClientTick();    static Gk8HttpClient* GetInstance();};#endif

C++实现HTTP通信类:Gk8HttpClient.cpp

#include "Gk8HttpClient.h"#include "curl/curl.h"#include "Gk8OperSys.h"#include "Gk8SetMb.cpp"#include <queue>#include <pthread.h>#include <semaphore.h>#include <errno.h>#include <fcntl.h>static Gk8HttpClient* sg_pHttpClient=NULL;        //[静态HTTP客户端]static GK8_BOOL sg_bHttpClientQuit=false;        //[退出HTTP]static sem_t* sg_pSem=NULL;                        //[信号量的数据类型]static GK8_INT sg_AsyncRequestCount=0;            //[同步请求数]//[线程及互斥定义]static pthread_t sg_NetWorkThread;                //[HTTP线程]static pthread_mutex_t sg_RequestQueueMutex;    //[HTTP请求队列互斥体]static pthread_mutex_t sg_ResponseQueueMutex;    //[HTTP响应队列互斥体]static Gk8SetMb<Gk8HttpRequest*> sg_iRequestQueue;        //[HTTP请求队列]static Gk8SetMb<Gk8HttpResponse*> sg_iResponseQueue;    //[HTTP响应队列]static GK8_CHAR sg_szErrorBuf[CURL_ERROR_SIZE];            //[错误信息]static Gk8Str sg_iErrorStr;typedef size_t (*HTTPWRITE_CALLBACK)(GK8_LPVOID lpData,size_t nSize,size_t nMemBlock,GK8_LPVOID lpResponseData);#if (GK8_TARGET_PLATFORM==GK8_PLATFORM_ioS)#define GK8_ASYNC_HTTPREQUEST_USE_NAMED_SEMAPHORE 1#else#define GK8_ASYNC_HTTPREQUEST_USE_NAMED_SEMAPHORE 0#endif#if GK8_ASYNC_HTTPREQUEST_USE_NAMED_SEMAPHORE#define GK8_ASYNC_HTTPREQUEST_SEMAPHORE "Gk8HttpAsync"#elsestatic sem_t sg_iSem;#endifGK8_BOOL ConfigureCURL(CURL* pCurl);GK8_INT ProcessGetTask(Gk8HttpRequest* pHttpRequest,HTTPWRITE_CALLBACK lpCallBack,GK8_LPVOID lpStream,GK8_LPINT lpResponseCode);GK8_INT ProcessPostTask(Gk8HttpRequest* pHttpRequest,HTTPWRITE_CALLBACK lpCallBack,GK8_LPVOID lpStream,GK8_LPINT lpResponseCode);//[接收HTTP数据]size_t WriteHttpData(GK8_LPVOID lpData,size_t nSize,size_t nMemBlock,GK8_LPVOID lpResponseData){    Gk8ByteMaker* pResponseData=(Gk8ByteMaker*)lpResponseData;    size_t nLength=nSize*nMemBlock;    pResponseData->WriteBuf(lpData,(GK8_INT)nLength);    return nLength;}//[设置CURL超时属性设置]GK8_BOOL ConfigureCURL(CURL* pCurl){    if(!pCurl) return false;    CURLcode nCurlCode=curl_easy_setopt(pCurl,CURLOPT_ERRORBUFFER,sg_szErrorBuf);    if(nCurlCode!=CURLE_OK) return false;    nCurlCode=curl_easy_setopt(pCurl,CURLOPT_TIMEOUT,Gk8HttpClient::GetInstance()->GetTimeoutForRead());    if(nCurlCode!=CURLE_OK) return false;    nCurlCode=curl_easy_setopt(pCurl,CURLOPT_CONNECTTIMEOUT,Gk8HttpClient::GetInstance()->GetTimeoutForConnect());    if(nCurlCode!=CURLE_OK) return false;    curl_easy_setopt(pCurl,CURLOPT_SSL_VERIFYPEER,0L);    curl_easy_setopt(pCurl,CURLOPT_SSL_VERIFYHOST,0L);    curl_easy_setopt(pCurl,CURLOPT_NOSIGNAL,1L);    return true;}//[处理Get请求]GK8_INT ProcessGetTask(Gk8HttpRequest* pHttpRequest,HTTPWRITE_CALLBACK lpCallBack,GK8_LPVOID lpStream,GK8_LPINT lpResponseCode){    CURLcode nCurlCode=CURL_LAST;    CURL* pCurl=curl_easy_init();    do    {        if(!ConfigureCURL(pCurl)) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_URL,pHttpRequest->GetHttpUrl());        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_WRITEFUNCTION,lpCallBack);        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_WRITEDATA,lpStream);        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_FOLLOWLOCATION,true);        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_USERAGENT,"libcurl-agent/1.0");        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_perform(pCurl);        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_getinfo(pCurl,CURLINFO_RESPONSE_CODE,lpResponseCode);        //[200:指示客服端的请求已经成功收到,解析,接受]        if(nCurlCode!=CURLE_OK||*lpResponseCode!=200)        {            nCurlCode=CURLE_HTTP_RETURNED_ERROR;        }    }while(0);    if(pCurl) curl_easy_cleanup(pCurl);    return (nCurlCode==CURLE_OK?0:1);}//[处理POST请求:流的行事发出]GK8_INT ProcessPostTask(Gk8HttpRequest* pHttpRequest,HTTPWRITE_CALLBACK lpCallBack,GK8_LPVOID lpStream,GK8_LPINT lpResponseCode){    CURLcode nCurlCode=CURL_LAST;    CURL* pCurl=curl_easy_init();    do    {        if(!ConfigureCURL(pCurl)) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_URL,pHttpRequest->GetHttpUrl());        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_WRITEFUNCTION,lpCallBack);        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_WRITEDATA,lpStream);        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_POST,1);        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_POSTFIELDS,pHttpRequest->GetRequestData()->GetBuf());        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_setopt(pCurl,CURLOPT_POSTFIELDSIZE,pHttpRequest->GetRequestDataSize());        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_perform(pCurl);        if(nCurlCode!=CURLE_OK) break;        nCurlCode=curl_easy_getinfo(pCurl,CURLINFO_RESPONSE_CODE,lpResponseCode);        if(nCurlCode!=CURLE_OK||*lpResponseCode!=200)        {            nCurlCode=CURLE_HTTP_RETURNED_ERROR;        }    }while(0);    if(pCurl) curl_easy_cleanup(pCurl);    return (nCurlCode==CURLE_OK?0:1);}//[创建网络线程]static GK8_LPVOID NetWorkThread(GK8_LPVOID lpData){    Gk8HttpRequest* pHttpRequest=NULL;    Gk8HttpResponse* pHttpResponse=NULL;    while(true)    {        //Wait for http request tasks from main thread        GK8_INT nSemWaitRet=sem_wait(sg_pSem);        if(nSemWaitRet<0)        {            _GK8ERR<<"HttpRequest async thread semaphore error:"<<strerror(errno)<<CR;            break;        }        if(sg_bHttpClientQuit) break;        //[第一步:发送HTTP请求]        pHttpRequest=NULL;        pthread_mutex_lock(&sg_RequestQueueMutex);        if(0!=sg_iRequestQueue.GetSize())        {            pHttpRequest=sg_iRequestQueue.GetItemAt(0);            sg_iRequestQueue.RemoveItemAt(0);        }        pthread_mutex_unlock(&sg_RequestQueueMutex);        if(NULL==pHttpRequest) continue;        //[第二步:libCurl同步请求]        pHttpResponse=new Gk8HttpResponse(pHttpRequest);        GK8_INT nResponseCode=-1;        GK8_INT nRetValue=0;        switch(pHttpRequest->GetRequestType())        {            case Gk8HttpRequest::kHttpGet:                nRetValue=ProcessGetTask(pHttpRequest,WriteHttpData,pHttpResponse->GetResponseData(),&nResponseCode);                break;            case Gk8HttpRequest::kHttpPost:                nRetValue=ProcessPostTask(pHttpRequest,WriteHttpData,pHttpResponse->GetResponseData(),&nResponseCode);                break;            default:                _GK8ERR<<"Gk8HttpClient:Unkown Request Type,Only GET And POST Are Supported"<<CR;                break;        }        pHttpResponse->SetResponseCode(nResponseCode);        //[清除请求中的二进制数据]        pHttpRequest->ClearRequestData();        if(nRetValue!=0)        {            pHttpResponse->SetSucceed(false);            sg_iErrorStr=sg_szErrorBuf;            pHttpResponse->SetErrorBuffer(sg_iErrorStr);        }else        {            pHttpResponse->SetSucceed(true);        }        pthread_mutex_lock(&sg_ResponseQueueMutex);        sg_iResponseQueue.AddItem(pHttpResponse);        pthread_mutex_unlock(&sg_ResponseQueueMutex);    }    sg_AsyncRequestCount-=sg_iRequestQueue.GetSize();    pthread_mutex_lock(&sg_RequestQueueMutex);    sg_iRequestQueue.Clear();    pthread_mutex_unlock(&sg_RequestQueueMutex);    if(sg_pSem!=NULL)    {#if GK8_ASYNC_HTTPREQUEST_USE_NAMED_SEMAPHORE        sem_unlink(GK8_ASYNC_HTTPREQUEST_SEMAPHORE);        sem_close(sg_pSem);#else        sem_destroy(sg_pSem);#endif        sg_pSem=NULL;        pthread_mutex_destroy(&sg_RequestQueueMutex);        pthread_mutex_destroy(&sg_ResponseQueueMutex);        //[依次删除数据]        GK8_INT nIndex;        for(nIndex=0;nIndex<sg_iRequestQueue.GetSize();nIndex++)        {            pHttpRequest=sg_iRequestQueue.GetItemAt(nIndex);            delete pHttpRequest;        }        for(nIndex=0;nIndex<sg_iResponseQueue.GetSize();nIndex++)        {            pHttpResponse=sg_iResponseQueue.GetItemAt(nIndex);            delete pHttpResponse;        }        sg_iRequestQueue.Destroy();        sg_iResponseQueue.Destroy();    }    pthread_exit(NULL);    return 0;}/////////////////////////////////////////////////////////////////Gk8HttpClient::Gk8HttpClient():m_nTimeOutForRead(60),m_nTimeOutForConnect(30){}Gk8HttpClient::~Gk8HttpClient(){    sg_bHttpClientQuit=true;    if(sg_pSem!=NULL)    {        sem_post(sg_pSem);    }}//[初始化线程]GK8_BOOL Gk8HttpClient::InitThreadSemphore(){    if(sg_pSem!=NULL)    {        return true;    }else    {#if GK8_ASYNC_HTTPREQUEST_USE_NAMED_SEMAPHORE        sg_pSem=sem_open(GK8_ASYNC_HTTPREQUEST_SEMAPHORE,O_CREAT,0644,0);        if(sg_pSem==SEM_FAILED)        {            _GK8ERR<<"Open HttpRequest Semaphore Failed"<<CR;            sg_pSem=NULL;            return false;        }#else        GK8_INT nSemRet=sem_init(&sg_iSem,0,0);        if(nSemRet<0)        {            _GK8ERR<<"Init HttpRequest Semaphore Failed"<<CR;            return false;        }        sg_pSem=&sg_iSem;#endif        pthread_mutex_init(&sg_RequestQueueMutex,NULL);        pthread_mutex_init(&sg_ResponseQueueMutex,NULL);        pthread_create(&sg_NetWorkThread,NULL,NetWorkThread,NULL);        pthread_detach(sg_NetWorkThread);        sg_bHttpClientQuit=false;    }    return true;}//[发送HTTP请求]GK8_VOID Gk8HttpClient::Send(Gk8HttpRequest* pHttpRequest){    if(false==InitThreadSemphore()) return;    if(!pHttpRequest) return;    ++sg_AsyncRequestCount;    pthread_mutex_lock(&sg_RequestQueueMutex);    sg_iRequestQueue.AddItem(pHttpRequest);    pthread_mutex_unlock(&sg_RequestQueueMutex);    sem_post(sg_pSem);}//[获取HTTP单例]Gk8HttpClient* Gk8HttpClient::GetInstance(){    if(sg_pHttpClient==NULL) sg_pHttpClient=new Gk8HttpClient();    return sg_pHttpClient;}//[HTTP响应帧控制]GK8_VOID Gk8HttpClient::HttpClientTick(){    if(sg_pSem==NULL) return;    Gk8HttpResponse* pHttpResponse=NULL;    pthread_mutex_lock(&sg_ResponseQueueMutex);    if(sg_iResponseQueue.GetSize()>0)    {        pHttpResponse=sg_iResponseQueue.GetItemAt(0);        sg_iResponseQueue.RemoveItemAt(0);    }    pthread_mutex_unlock(&sg_ResponseQueueMutex);    if(pHttpResponse)    {        --sg_AsyncRequestCount;        Gk8HttpRequest* pHttpRequest=pHttpResponse->GetHttpRequest();        Gk8BaseObj* pTarget=pHttpRequest->GetTarget();        HTTPREQUEST_CALLBACK_FUN pSelector=pHttpRequest->GetSelector();        //[回调处理:记录数据]        if(pTarget&&pSelector)        {            (pTarget->*pSelector)(pHttpResponse);        }        //[销毁请求数据]        delete pHttpResponse;    }}

C++实现Servlet类:Gk8HttpServlet.h

#ifndef __GK8HTTPSERVICE_H__#define __GK8HTTPSERVICE_H__#pragma once#include "curl/curl.h"#include "Gk8HttpClient.h"#include "Gk8HttpRequest.h"#include "Gk8HttpResponse.h"class Gk8HttpServlet:public Gk8BaseObj{    DECLARE_TOSPP_MAP;private:    Gk8Str m_sHttpUrl;                //[HTTP请求地址]    Gk8ByteMaker m_iRequestData;    //[HTTP请求数据]    Gk8Var m_iHttpCallVar;            //[HTTP回调信息]    GK8_VOID ServletRequestCompleted(GK8_LPVOID lpHttpResponse);public:    Gk8HttpServlet();    ~Gk8HttpServlet();    GK8_VOID TOSPPFUNC SendHttpMessage(GK8_LPCSTR lpHttpData,Gk8Var& iHttpCallVar);};#endif

C++实现Servlet类:Gk8HttpServlet.cpp

#include "Gk8HttpServlet.h"#include "Gk8OperSys.h"#include "Gk8Helper.h"static Gk8Str sg_iReceiveMessageEvent("OnReceiveMessage");//[接收网络信息]#define HTTPSERVLET_FAIL        0        //[HTTP请求失败]#define HTTPSERVLET_SUCC        1        //[HTTP请求成功]/////////////////////////////////////////////CLASS-TOlua////////////////////////////////////////////////////TOLUA_CLASS_COLLECT_FUNC(Gk8HttpServlet)BEGIN_TOLUA_CLASS_FUNC(Gk8HttpServlet,NewObj)    if(!CheckToLuaFunParam(L,"NewObj",Gk8Var()<<ISUSERTABLE("Gk8HttpServlet")<<ISVABOOLEAN<<ISNOOBJ)) return 0;    Gk8HttpServlet* pHttpServlet=(Gk8HttpServlet*)Mtolua_new((Gk8HttpServlet)());    tolua_pushusertype(L,(GK8_LPVOID)pHttpServlet,"Gk8HttpServlet");    if(IFBOOLEAN(2)) tolua_reGISter_GC(L,lua_gettop(L));END_TOLUA_CLASS_FUNCBEGIN_TOLUA_CLASS_FUNC(Gk8HttpServlet,SendHttpMessage)    if(!CheckToLuaFunParam(L,"SendHttpMessage",Gk8Var()<<ISUSERTYPE("Gk8HttpServlet")<<ISSTRING<<ISVAFUNCTION<<ISNOOBJ)) return 0;    //TOLUAGETOBJ(Gk8HttpServlet,1)->SendHttpMessage(TOLUAGETSTRING(2),TOLUAGETFUNEX(L,3,0));END_TOLUA_CLASS_FUNC//[启动注册类的全部TOLUA函数]BEGIN_TOLUA_FUN_MAP(Gk8HttpServlet)    TOLUA_CLASS(Gk8HttpServlet,Gk8BaseObj,"[网络类]","[HTTP请求类]")    TOLUA_CLASS_FUNC(Gk8HttpServlet,NewObj,"[Gk8HttpServlet* NewObj(GK8_BOOL ifLocal=false)?创建Gk8HttpServlet对象]")    TOLUA_CLASS_FUNC(Gk8HttpServlet,SendHttpMessage,"[GK8_VOID SendHttpMessage(GK8_LPCSTR lpHttpData,iHttpCallVar)?发送HTTP请求,字符串模式]")END_TOLUA_FUN_MAP/////////////////////////////////////////////CLASS-TOSPP////////////////////////////////////////////////////BEGIN_TOSPP_MAP(Gk8HttpServlet,Gk8BaseObj)    TOSPP_FUNC(Gk8HttpServlet,SendHttpMessage,' ',"s&v","SendHttpMessage(lpHttpData,iHttpCallVar)")END_TOSPP_MAP()/////////////////////////////////////////////////////////////////////////////////////////////////Gk8HttpServlet::Gk8HttpServlet(){}Gk8HttpServlet::~Gk8HttpServlet(){}//[发送HTTP请求注意编码问题]GK8_VOID Gk8HttpServlet::SendHttpMessage(GK8_LPCSTR lpHttpData,Gk8Var& iHttpCallVar){    m_sHttpUrl=lpHttpData;    //[注册脚本回调消息]    m_iHttpCallVar=iHttpCallVar;    Gk8Var iEmptyVar;    if(m_iHttpCallVar.GetSize()==1 && m_iHttpCallVar[0].IfInt()) SetEvent(sg_iReceiveMessageEvent,m_iHttpCallVar[0],iEmptyVar);    Gk8HttpRequest* pHttpRequest=new Gk8HttpRequest();    pHttpRequest->SetRequestType(Gk8HttpRequest::kHttpGet);    pHttpRequest->SetHttpUrl(m_sHttpUrl);    pHttpRequest->SetResponseCallBack(this,(HTTPREQUEST_CALLBACK_FUN)&Gk8HttpServlet::ServletRequestCompleted);    pHttpRequest->SetRequestData(&m_iRequestData);    Gk8HttpClient::GetInstance()->Send(pHttpRequest);}//[HTTP请求信息回调]GK8_VOID Gk8HttpServlet::ServletRequestCompleted(GK8_LPVOID lpHttpResponse){    Gk8HttpResponse* pHttpResponse=(Gk8HttpResponse*)lpHttpResponse;    if(!pHttpResponse) return;    //[把服务器数据派遣到脚本中]    GK8_INT nFailCode=HTTPSERVLET_SUCC;    Gk8Str iResponstStr;    if(!pHttpResponse->IsSucceed())    {        _GK8ERR<<"Gk8HttpServlet Response Failed Error Is "<<pHttpResponse->GetErrorBuffer()<<CR;        iResponstStr="UnKown Error";        nFailCode=HTTPSERVLET_FAIL;    }else    {        Gk8ByteMaker* pResponseData=pHttpResponse->GetResponseData();        iResponstStr.BinToStr(pResponseData->GetBuf(),pResponseData->GetStreamSize());    }    if(m_iHttpCallVar.GetSize()==1)    {        RunEventWithArgs(sg_iReceiveMessageEvent,iResponstStr);    }else    {        if(!m_iHttpCallVar[0].IfPtr()||!IfObjPtr(m_iHttpCallVar[0].GetPtr(),m_iHttpCallVar[0].GetPtrId())) return;        Gk8Obj* pBindObj=m_iHttpCallVar[0].GetSafePtr();        Gk8Var iParamVar;        iParamVar<<nFailCode<<iResponstStr;        pBindObj->OnCall(m_iHttpCallVar[1],iParamVar);    }    //[直接删除本身]    SafeDeleteObj(this);}

看完上述内容,你们掌握如何使用HTTP实现文本传输的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何使用HTTP实现文本传输

本文链接: https://www.lsjlt.com/news/241046.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用HTTP实现文本传输
    如何使用HTTP实现文本传输,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网...
    99+
    2023-06-05
  • 如何使用C++实现HTTP流传输?
    如何在 c++++ 中实现 http 流传输?使用 boost.asio 和 asiohttps 客户端库创建 ssl 流套接字。连接到服务器并发送 http 请求。接收 http 响应...
    99+
    2024-05-12
    c++ http
  • 如何使用HTTP实现二进制传输
    本篇文章给大家分享的是有关如何使用HTTP实现二进制传输,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。HTTP实现二进制传输。曾经为这事还纠结过。刚工作时游戏都是端游。基本学习...
    99+
    2023-06-05
  • nodejs怎么实现http传输大文件
    这篇文章主要介绍“nodejs怎么实现http传输大文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs怎么实现http传输大文件”文章能帮助大家解决问题...
    99+
    2024-04-02
  • 超文本传输协议HTTP有什么用
    小编给大家分享一下超文本传输协议HTTP有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!超文本传输协议(HTTP,HyperText Transfer Pr...
    99+
    2023-06-05
  • 如何使用 Golang 实现 HTTP 文件上传安全性?
    在 golang 中实现 http 文件上传安全性需要遵循以下步骤:验证文件类型。限制文件大小。检测病毒和恶意软件。存储文件安全。 如何使用 Golang 实现 HTTP 文件上传安全...
    99+
    2024-05-13
    http 安全性 git golang
  • ASP开发技术如何在文件传输中使用HTTP?
    ASP是一种动态Web开发技术,可用于创建交互式Web应用程序。在Web应用程序中,文件传输是非常重要的功能。在ASP中,可以使用HTTP协议进行文件传输。本文将介绍ASP开发技术如何在文件传输中使用HTTP,并提供相应的演示代码。 HT...
    99+
    2023-08-17
    开发技术 文件 http
  • ASP编程算法中,如何使用HTTP接口实现数据传输?
    ASP(Active Server Pages)是一种基于Microsoft的服务器端脚本技术,它可以用来开发动态网站、Web应用程序和Web服务。在ASP编程中,HTTP接口是一种非常重要的数据传输方式。通过HTTP接口,ASP程序可以...
    99+
    2023-11-09
    编程算法 http 接口
  • golang如何实现大文件传输
    在 Golang 中,可以使用 io 和 os 包来实现大文件的传输。以下是一种可能的实现方式: 首先,需要创建一个服务器端和一个客...
    99+
    2023-10-21
    golang
  • 如何使用 Golang 实现 HTTP 文件上传的重试机制?
    使用 go 实现 http 文件上传重试机制:使用 client.do() 方法发送请求。在发生错误时,等待指定的秒数(retrywaitseconds)。最多重试 maxretries...
    99+
    2024-05-14
    golang http
  • 如何使用 Python 和 Spring Boot 实现文件传输功能?
    文件传输是现代应用程序中常见的需求之一。Python 和 Spring Boot 是两种非常流行的编程语言,它们都提供了丰富的工具和库,可以轻松地实现文件传输功能。在本文中,我们将探讨如何使用 Python 和 Spring Boot 实...
    99+
    2023-09-04
    文件 关键字 spring
  • 如何实现linux下socket文件传输
    这期内容当中小编将会给大家带来有关如何实现linux下socket文件传输,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是 socket?socket 的原意是“插座”,在计算机通信领域,socket...
    99+
    2023-06-28
  • Golang如何实现文件传输功能
    今天小编给大家分享一下Golang如何实现文件传输功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。借助TCP完成文件的传输...
    99+
    2023-07-05
  • Node.js 版本中如何使用HTTP上传G 级的文件之
    Node.js 版本中如何使用HTTP上传G 级的文件之 ,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。不管喜欢与否,javascript无处...
    99+
    2024-04-02
  • 如何在ASP开发技术中使用HTTP来优化文件传输?
    ASP(Active Server Pages)是一种基于服务器端的Web应用程序开发技术,它可以帮助开发人员快速创建动态Web页面并与后端数据库进行交互。在ASP开发过程中,文件传输是非常常见的操作,例如上传用户文件、下载服务器文件等。...
    99+
    2023-08-17
    开发技术 文件 http
  • Http服务传输图片的Python实现
    介绍 主要介绍Python实现的Http服务传输图片的2种方式:URL和字节流 以URL的方式传输图片 服务器端 基于tornado框架搭建简单的web服务, 提供post方法, 通过接收image_url字段获取图片的url,...
    99+
    2023-01-31
    图片 Http Python
  • 如何使用netcat进行文件传输
    这篇文章将为大家详细讲解有关如何使用netcat进行文件传输,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先看一下帮助信息。$ nc -hOpenBSD netcat&nb...
    99+
    2023-06-09
  • 如何在无线J2ME设备上实现超文本传输协议
    这篇文章主要介绍如何在无线J2ME设备上实现超文本传输协议,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!随着越来越多手提电话和个人数字助理开始融入到信息高速公路之上,从移动设备上访问web站点变得越来越重要。Java...
    99+
    2023-06-03
  • 如何使用Python NumPy在Unix系统上优化HTTP传输?
    在当今的数字时代中,HTTP传输是非常重要的一种数据传输方式。然而,由于网络环境的不可控性以及传输数据的大小和复杂度,HTTP传输的效率往往受到一定的限制。为了更好地解决这个问题,我们可以使用Python NumPy库在Unix系统上进行优...
    99+
    2023-06-24
    numpy unix http
  • 如何使用Python NumPy和Unix系统来优化HTTP传输?
    HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的通信协议,是互联网上应用最广泛的协议之一。然而,在实际应用中,HTTP传输的速度受到了很多限制,如网络带宽、传输距离等。本文将介绍如何使用Python ...
    99+
    2023-06-24
    numpy unix http
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作