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