当前位置: 首页 > 工具软件 > Node-Lua > 使用案例 >

cocoslua消息服务器,cocos2dx-lua-——-Http请求总结与实战-封装

濮阳茂材
2023-12-01

今天的主题是关于cocos2dx lua实现短链接网络请求,使用Http实现基本的服务器网络数据获取,关于长链接(socket后续文件或者遇到需要的时候回特别实现与处理)

关于Http这里就不多做介绍了,不过,作为一个程序员,网络请求是开发中最多也是最重要的一环节,这里比较建议,搞懂http的整个请求流程!

在有了基本的Lua知识和cocos2dx lua基本的了解和学习之后,我有了一个初步的cocos2dx lua开发常识,然后就开始在上面实现基本的界面,并根据界面操作请求和响应数据!

入口场景

在main中初始化场景中必要的UI.

创建一个背景图片和一个按钮,实现点击按钮跳转到另外一个场景,进行网络请求和数据获取

--- @class MainScene

local MainScene = class("MainScene",cc.load("mvc").ViewBase)

---onEnter

function MainScene:onEnter()

print("onEnter")

end

---createStaticButton 通用创建按钮方法

---@param node table

---@param imageName table

---@param x table

---@param y table

---@param callBack table

local function createStaticButton(node, imageName, x, y, callBack)

local btn = ccui.Button:create(imageName, imageName)

btn:move(x, y)

btn:addClickEventListener(callBack)

btn:addTo(node)

end

--

-----onCreate

function MainScene:onCreate()

-- 初始化背景

display.newSprite("HelloWorld.png")

:move(display.center)

:addTo(self)

-- 初始化按钮

createStaticButton(self, "button_start.png", display.cx, display.cy-150, function ()

self:getApp():enterScene("ApiRequest")

end)

end

return MainScene

网络应用场景(ApiRequest)

然后开始处理跳转之后的ApiRequest,和相关请求逻辑,这里主要是使用我们封装好的CocosRequest实现基本上的请求逻辑,然后拿到数据之后我们就可以根据实际UI和具体业务逻辑做处理

注意

测试的时候,将local url = "https://xxxx?cmd=501001&uid=628941&novelid=3782"中的值换成自己的地址就可以

require "json"

local CocosRequest = require "app.CocosRequest"

--- @class ApiRequest

local ApiRequest = class("ApiRequest", cc.load("mvc").ViewBase)

----local MainScene = class("MainScene", function() return display.newScene("MainScene") end)

---onEnter

function ApiRequest:onEnter()

print("onEnter")

end

-----onCreate

function ApiRequest:onCreate()

----------------------- 创建自定义事件 start

local function eventCustomListener1(event)

local str = "response: "..event._usedata

--labelStatusCode:setString(str)

-- 如果返回的是 json 数据,这里解析

local data = json.decode(event._usedata)

table.foreach(data,

function(key, var)

print("-----"..key)

table.foreach(var,

function(a, b)

print(a.."-"..b)

end)

end)

end

local listener1 = cc.EventListenerCustom:create("customEvent1",eventCustomListener1)

cc.Director:getInstance():setNotificationNode(cc.Node:create())

local eventDispatcher = cc.Director:getInstance():getNotificationNode():getEventDispatcher()

eventDispatcher:addEventListenerWithFixedPriority(listener1, 6)

-- 将事件分配器赋值到CocosRequest.eventDispatcher

-- 用来在http请求返回的回调函数中使用,因为回调函数是在异步线程中执行,必须用自定义事件更新ui线程数据

local tmpHttp = CocosRequest:getInstance()

tmpHttp.eventDispatcher = eventDispatcher

----------------------- 创建自定义事件 end

local tmp = CocosRequest:getInstance()

local function callback(xhr)

local event = cc.EventCustom:new("customEvent1")

event._usedata = xhr.response

eventDispatcher:dispatchEvent(event)

print("post callback code = "..xhr.statusText)

end

local type = tmp.POST

local url = "https://xxxx?cmd=501001&uid=628941&novelid=3782"

local dataPost = {}

dataPost.data = "hello"

dataPost.aaa = "world"

dataPost.bbb = "yang"

tmp:send(type, url, dataPost, callback)

end

return ApiRequest

网络请求封装(CocosRequest)

最后才是我们的重头戏,CocosRequest是直接使用cocos2dx lua提供的XMLHttpRequest实现,其实就是做了一套逻辑,具体细节可以根据项目调整(此处已经测试通过,可直接拷贝使用)

require "json"

CocosRequest = {}

CocosRequest.__index = CocosRequest

CocosRequest.instance = nil

CocosRequest.callback = nil

CocosRequest.POST = "POST"

CocosRequest.GET = "GET"

function CocosRequest:new()

local self = {}

setmetatable(self,CocosRequest)

return self

end

function CocosRequest:getInstance()

if nil == self.instance then

self.instance = self:new()

end

return self.instance

end

-- 数据转换,将请求数据由 table 型转换成 string,参数:table

function CocosRequest:dataParse(data)

if "table" ~= type(data) then

print("data is not a table")

return nil

end

 类似资料: