Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了[寒江孤叶丶的Cocos2d-x之旅_14]Cocos2d-x 3.2版本以上LUA脚本Socket通讯解决方案——LuaSocket大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列]

博客地址:http://blog.csdn.net/qq446569365

在Coco2d-x3.2版本中,对LuaSocket进行了集成,我们可以直接在程序中调用luaSocket进行方便的TCP/UDP/FTP/http等等通讯,非常方便

下边先上一段代码:

    local socket = require("socket")
    local host = "115.28.*.*"
    local port = 8890
    local c = socket.tcp()
    --c:settimeout(5)
    local n,<span style="font-family: Arial,Helvetica,sans-serif;">e</span><span style="font-family: Arial,sans-serif;"> = c:connect(host,port)</span>
    print("connect return:",n,E)--通过判断n可以判断连接是否成功,n是1表示成功 n是nil表示不成功
    c:send("Hello")
    while true  do
        local response,receive_status=c:receive()
        --print("receive return:",response or "nil",receive_status or "nil")
            if receive_status ~= "closed" then
                if response then
                    print("receive:"..responsE)
                end
            else
                break
            end
        end
    end
这段代码实现了TCP的链接,并像服务器发送了一段“Hello”,然后便阻塞进程等待服务器消息了。

说到阻塞,就不得不提到多进程,然后在LUA中,使用多线程会极大程度降低LUA的性能。

这里 LuaSocket提供了一个不错的解决方案:c:settimeout(0)

经过这样的设置,程序便会发生阻塞,然后在schedule中循环调用即可。

附上一个目前我程序中的临时解决方案:

function sockeTinit()
    local socket = require("socket")
    local host = "115.28.*.*"
    local port = 8890
    G_SOCKETTCP = socket.tcp()
    local n,e = G_SOCKETTCP:connect(host,port)
    print("connect return:",E)
    G_SOCKETTCP:settimeout(0)
end
function socketClose()
    G_SOCKETTCP:close()
end
function socketSend(sendStr)
    G_SOCKETTCP:send(sendStr)
end
function socketReceive()
    local response,receive_status=G_SOCKETTCP:receive()
        --print("receive return:",receive_status or "nil")
        if receive_status ~= "closed" then
            if response then
                print("Receive message:"..responsE)
                --对返回的内容进行解析即可
            end
        else
            print("service Closed!")
        end
end
然后在程序中进行调用即可
    sockeTinit()
    local timePassed = 0
    local function myHandler(dt)
        timePassed= timePassed + dt
        if timePassed > 0.1 then
            socketReceive()
            timePassed= 0
        end
    end
    self:scheduleupdateWithPriorityLua(myHandler,1)
    --print(self.roomTypE)
    local jsonStr=getRoomInformationJson(self.roomTypE)
    print(jsonStr)
    socketSend(jsonStr)

在Lua程序设计第二版中,提到了通过C语言函数来实现LUA多线程的功能,我会在下一篇博客中详细介绍。

特别提醒:LuaSocket在receive的时候,是把\n当成结尾,如果没有\n,会出现timeout的错误,所以服务器在发送消息的时候,一定要记得在消息的最后加一个\n作为结尾!

大佬总结

以上是大佬教程为你收集整理的[寒江孤叶丶的Cocos2d-x之旅_14]Cocos2d-x 3.2版本以上LUA脚本Socket通讯解决方案——LuaSocket全部内容,希望文章能够帮你解决[寒江孤叶丶的Cocos2d-x之旅_14]Cocos2d-x 3.2版本以上LUA脚本Socket通讯解决方案——LuaSocket所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。