cocos2d-x-LuaProxy学习日志(6) -- C/S通信交互之WebSocket

C/S通信交互之WebSocket


      对于手游网络通信的交互,一般情况下,Socket长连接直接使用Mina框架即可,对于Http短连接使用Servlet 入口即可,那么本篇主要介绍Socket长连接,当然与此配对的跨平台通信则选择了WebSocket,当然还有其他的.

对于WebSocket不是很熟悉,可以参考WebSocket。本教程,主要讲怎样在客户端搭建websocket。


步骤一:


打开CCAppDelegate.cpp,添加头文件 #include "Lua_web_socket.h" , 在applicationDidFinishLaunching()添加如下代码:

    CCLuaStack *pStack = pEngine->getLuaStack();
    lua_State* L = pStack->getLuaState();
    
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
    pStack = pEngine->getLuaStack();
    L = pStack->getLuaState();
    tolua_web_socket_open(L);
#endif

步骤二:


编写lua测试代码,如下:

-- for CCLuaEngine traceback

function __G__TRACKBACK__(msg)
print("----------------------------------------")
print("LUA ERROR: " .. tostring(msg) .. "\n")
print(debug.traceback())
print("----------------------------------------")
end

local function main()
-- avoid memory leak
--[[
collectgarbage("setpause", 100)
collectgarbage("setstepmul", 5000)

local cclog = function(...)
print(string.format(...))
end

require "hello2"
cclog("result is " .. myadd(3, 5))
]]
---------------

--
local function createTest()
	local TestLayer = CCLayer:create()
	local proxy = LuaProxy:create()
	proxy:retain() -- hold the proxy, while the button gone, release the proxy.
	local n = proxy:readCCBFromFile("ccbResources/ccb/Test.ccbi") -- Got a CCNode
	local l = tolua.cast(n, "CCLayer") -- Cast the node into CCLayer
	TestLayer:addChild(l)

	--winsocket
	local TestTxt = tolua.cast(proxy:getNode"TestTxt","CCLabelTTF")
	TestTxt:setString"web Socket"
	
	local winSize = CCDirector:sharedDirector():getWinSize()
    local MARGIN = 40
    local SPACE  = 35
    local wsSendText   = nil
    local wsSendBinary = nil
    local wsError      = nil
    local sendTextStatus  = nil
    local sendBinaryStatus = nil
    local errorStatus  = nil
    local receiveTextTimes = 0
    local receiveBinaryTimes = 0
	
	--Send Text
	local function onMenuSendTextClicked()
		if nil ~= wsSendText then
			if kStateOpen == wsSendText:getReadyState() then
				sendTextStatus:setString("Send Text WS is waiting...")
				wsSendText:sendTextMsg("Hello WebSocket中文, I'm a text message.")
			else
                local warningStr = "send text websocket instance wasn't ready..."
                print(warningStr)
				sendTextStatus:setString(warningStr)
			end
		end
	end

	--Send Binary
	local function onMenuSendBinaryClicked()
		if nil ~= wsSendBinary then
			if kStateOpen == wsSendBinary:getReadyState() then
				sendBinaryStatus:setString("Send Binary WS is waiting...")
				local buf = "Hello WebSocket中文--,\0 I'm\0 a\0 binary\0 message\0."
				local nLength = string.len(buf)
				t = {string.byte(buf,1,-1)}
				
				 wsSendBinary:sendBinaryMsg(t,table.getn(t))
			else
				local warningStr = "send binary websocket instance wasn't ready..."
				sendBinaryStatus:setString(warningStr)
			end
		end
	end


	--菜单
 	--Send Text
	local menuTest = tolua.cast(proxy:getNode"menu","CCMenu")
	
	local menuItemTest = proxy:getNode"menuTest","CCMenuItem"
	proxy:handleMenuEvent(menuItemTest,function()
		CCLuaLog("proxy:handleMenuEvent");
		onMenuSendTextClicked()
	end)

	--Send Binary
	local menuItemTest1 = proxy:getNode"menuTest1","CCMenuItem"
	proxy:handleMenuEvent(menuItemTest1,function()
		CCLuaLog("proxy:handleMenuEvent");
		onMenuSendBinaryClicked();
	end)

	
	--设置文字显示内容
	local showNode1 = tolua.cast(proxy:getNode"showNode1","CCNode")
	local showNode2 = tolua.cast(proxy:getNode"showNode2","CCNode")

   	--Send Text Status Label
	sendTextStatus = tolua.cast(proxy:getNode"sendTextStatus","CCLabelTTF")
	sendTextStatus:setString"Send Text WS is waiting..."
	sendTextStatus:setDimensions(showNode1:getContentSize());
	
	--Send Binary Status Label
	sendBinaryStatus = tolua.cast(proxy:getNode"sendBinaryStatus","CCLabelTTF")
	sendBinaryStatus:setString"Send Binary WS is waiting..."
	sendBinaryStatus:setDimensions(showNode2:getContentSize());
	
	 --Error Label
	errorStatus = tolua.cast(proxy:getNode"errorStatus","CCLabelTTF")
	errorStatus:setString"Error WS is waiting..."
	
	
    wsSendText   = WebSocket:create("ws://echo.websocket.org")
    wsSendBinary = WebSocket:create("ws://echo.websocket.org")
    wsError      = WebSocket:create("ws://localhost:8888/")
		
    local function wsSendTextOpen(strData)
        sendTextStatus:setString("Send Text WS was opened.")
    end
	
    local function wsSendTextMessage(strData)
        receiveTextTimes= receiveTextTimes + 1
        local strInfo= "response text msg: "..strData..", "..receiveTextTimes    
        sendTextStatus:setString(strInfo)
    end

    local function wsSendTextClose(strData)
        print("_wsiSendText websocket instance closed.")
        sendTextStatus = nil
        wsSendText = nil
    end

    local function wsSendTextError(strData)
        print("sendText Error was fired")
    end

    local function wsSendBinaryOpen(strData)
        sendBinaryStatus:setString("Send Binary WS was opened.")
    end
	
    local function wsSendBinaryMessage(paramTable)
        local length = table.getn(paramTable)
        local i = 1
        local strInfo = "response bin msg: "
        for i = 1,length do
            if 0 == paramTable[i] then
                strInfo = strInfo.."\'\\0\'"
            else
                strInfo = strInfo..string.char(paramTable[i])
            end 
        end
        receiveBinaryTimes = receiveBinaryTimes + 1
        strInfo = strInfo..receiveBinaryTimes
        sendBinaryStatus:setString(strInfo)
    end
	
    local function wsSendBinaryClose(strData)
        print("_wsiSendBinary websocket instance closed.")
        sendBinaryStatus = nil
        wsSendBinary = nil
    end

    local function wsSendBinaryError(strData)
        print("sendBinary Error was fired")
    end

    local function wsErrorOpen(strData)
    end

    local function wsErrorMessage(strData)

    end

    local function wsErrorError(strData)
        print("Error was fired")
        errorStatus:setString("an error was fired")
    end

    local function wsErrorClose(strData)
        print("_wsiError websocket instance closed.")
        errorStatus= nil
        wsError = nil
    end
	
	-- 注册wsSendText、wsSendBinary,wsError脚本处理函数
    if nil ~= wsSendText then
        wsSendText:registerScriptHandler(wsSendTextOpen,kWebSocketScriptHandlerOpen)
        wsSendText:registerScriptHandler(wsSendTextMessage,kWebSocketScriptHandlerMessage)
        wsSendText:registerScriptHandler(wsSendTextClose,kWebSocketScriptHandlerClose)
        wsSendText:registerScriptHandler(wsSendTextError,kWebSocketScriptHandlerError)
    end

    if nil ~= wsSendBinary then
        wsSendBinary:registerScriptHandler(wsSendBinaryOpen,kWebSocketScriptHandlerOpen)
        wsSendBinary:registerScriptHandler(wsSendBinaryMessage,kWebSocketScriptHandlerMessage)
        wsSendBinary:registerScriptHandler(wsSendBinaryClose,kWebSocketScriptHandlerClose)
        wsSendBinary:registerScriptHandler(wsSendBinaryError,kWebSocketScriptHandlerError)
    end

    if nil ~= wsError then
        wsError:registerScriptHandler(wsErrorOpen,kWebSocketScriptHandlerOpen)
        wsError:registerScriptHandler(wsErrorMessage,kWebSocketScriptHandlerMessage)
        wsError:registerScriptHandler(wsErrorClose,kWebSocketScriptHandlerClose)
        wsError:registerScriptHandler(wsErrorError,kWebSocketScriptHandlerError)
    end

    local function OnExit(strEventName)
        if "exit" == strEventName then
            if nil ~= wsSendText  then
                wsSendText:close()
            end
            if nil ~= wsSendBinary then
                wsSendBinary:close()
            end
            if nil ~=  wsError     then
                wsError:close()
            end
        end
    end
	
	  TestLayer:registerScriptHandler(OnExit)
	
	return TestLayer
end



-- run
local sceneGame = CCScene:create()
	sceneGame:addChild(createTest())
	CCDirector:sharedDirector():runWithScene(sceneGame)
end

xpcall(main, __G__TRACKBACK__)

运行效果图:





如有错误之处,希望大家多多纠正!


转载请注明出处:http://blog.csdn.net/rexuefengye/article/details/16803921


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值