Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了quick-cocos2d-x 学习系列之十二 关于websocket大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

quick-cocos2d-x 学习系列之十二 关于websocket

1.概念

百度百科:WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-dupleX)

在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。

在JavaEE7中也实现了WebSocket协议。

实现了websocket的浏览器:

Chrome

Supported in version 4+

Firefox

Supported in version 4+

Internet Explorer

Supported in version 10+

Opera

Supported in version 10+

Safari

Supported in version 5+

所以这个websocket还是比较靠谱的协议。那么在LUA中如何使用呢?

我们还是以DEMO为引子。

2.Websocket类

创建一个websocket类如下:

local WebSockets = class(@H_262_91@"WebSockets")

WebSockets.TEXT_messaGE = 0

WebSockets.bINARY_messaGE = 1

WebSockets.bINARY_ARRAY_messaGE = 2

WebSockets.oPEN_EVENT = @H_262_91@ "open"

WebSockets.messaGE_EVENT = @H_262_91@ "message"

WebSockets.CLOSE_EVENT = @H_262_91@ "close"

WebSockets.ERROR_EVENT = @H_262_91@ "error"

function WebSockets:ctor(url)

cc(self):addComponent(@H_262_91@"components.behavior.EventProtocol"):exportMethods()

self.socket = cc.WebSocket:create(url)

if self.socket then

self.socket:registerScriptHandler(handler(self,self.onOpen_),cc.WEBSOCKET_OPEN)

self.socket:registerScriptHandler(handler(self,self.onmessage_),cc.WEBSOCKET_messaGE)

self.socket:registerScriptHandler(handler(self,self.onClose_),cc.WEBSOCKET_CLOSE)

self.socket:registerScriptHandler(handler(self,self.onError_),cc.WEBSOCKET_ERROR)

end

end

function WebSockets:isReady()

return self.socket and self.socket:getReadyState() == cc.WEBSOCKET_STATE_OPEN

end

function WebSockets:send(data, messageType)

if not self:isReady() then

printError(@H_262_91@"WebSockets:send() - socket is't ready")

return false

end

messageType = checkint(messageType)

self.messageType = messageType

if messageType == WebSockets.TEXT_messaGE then

self.socket:sendString(toString(data))

elseif messageType == WebSockets.bINARY_ARRAY_messaGE then

data = checktable(data)

self.socket:sendString(data,table.nums(data))

else

self.socket:sendString(toString(data))

end

return true

end

function WebSockets:close()

if self.socket then

self.socket:close()

self.socket = nil

end

self:removeAllEventListeners()

end

function WebSockets:onOpen_()

self:dispatchEvent({name = WebSockets.oPEN_EVENT})

end

function WebSockets:onmessage_(message)

local params = {

name = WebSockets.messaGE_EVENT,

message = message,

messageType = self.messageType

}

self:dispatchEvent(params)

end

function WebSockets:onClose_()

self:dispatchEvent({name = WebSockets.CLOSE_EVENT})

self:close()

end

function WebSockets:onError_(error)

self:dispatchEvent({name = WebSockets.ERROR_EVENT,error = error})

end

return WebSockets

3.MainScene

调用该类的场景MainScene,如下。

local WebSockets = require(@H_262_91@"WebSockets")

local MainScene = class(@H_262_91@"MainScene",function()

return display.newScene(@H_262_91@"MainScene")

end)

local function bin2hex(binary)

local t = {}

for i = 1,String.len(binary) do

t[#t + 1] = String.format(@H_262_91@"0x%02x",String.byte(binary, i))

end

return table.concat(t,@H_262_91@" ")

end

function MainScene:ctor()

local connectLabel =

cc.ui.UIPushButton.new()

:setButtonLabel(cc.ui.UILabel.new({text= @H_262_91@"connect",size = 32}))

:onButtonClicked(function()

self:onConnectClicked()

end)

:align(display.CENTER,display.cx,display.top - 32)

:addTo(self)

local sendTextLabel =

cc.ui.UIPushButton.new()

:setButtonLabel(cc.ui.UILabel.new({text= @H_262_91@"send text",size = 32}))

:onButtonClicked(function()

self:onSendTextClicked()

end)

:align(display.CENTER,display.top - 64)

:addTo(self)

local sendBinaryLabel =

cc.ui.UIPushButton.new()

:setButtonLabel(cc.ui.UILabel.new({text= @H_262_91@"send binary",size = 32}))

:onButtonClicked(function()

self:onSendBinaryClicked()

end)

:align(display.CENTER,display.top - 96)

:addTo(self)

end

function MainScene:onOpen(event)

print(@H_262_91@"connected")

end

function MainScene:onmessage(event)

if WebSockets.bINARY_messaGE == event.messageType then

printf(@H_262_91@"receive binary msg: len = %s,binary = %s",String.len(event.messagE), bin2hex(event.messagE))

else

printf(@H_262_91@"receive text msg: %s",event.messagE)

end

end

function MainScene:onClose(event)

self.websocket = nil

end

function MainScene:onError(event)

printf(@H_262_91@"error %s",event.error)

self.websocket = nil

end

function MainScene:onConnectClicked()

if self.websocket then return end

self.websocket = WebSockets.new(@H_262_91@"ws://echo.websocket.org")

self.websocket:addEventListener(WebSockets.oPEN_EVENT,handler(self, self.onOpen))

self.websocket:addEventListener(WebSockets.messaGE_EVENT, self.onmessagE))

self.websocket:addEventListener(WebSockets.CLOSE_EVENT, self.onClosE))

self.websocket:addEventListener(WebSockets.ERROR_EVENT, self.onError))

end

function MainScene:onSendTextClicked()

if not self.websocket then

print(@H_262_91@"not connected")

return

end

local text = @H_262_91@"Hello" .. toString(@H_78_1@math.random())

if self.websocket:send(text) then

printf(@H_262_91@"send text msg: %s",text)

end

end

function MainScene:onSendBinaryClicked()

if not self.websocket then

print(@H_262_91@"not connected")

return

end

local t = {}

for i = 1,@H_78_1@math.random(4,8) do

t[#t + 1] = String.char(@H_78_1@math.random(0,31))

end

local binary = table.concat(t)

if self.websocket:send(binary, WebSockets.bINARY_messaGE) then

printf(@H_262_91@"send binary msg: len = %d,String.len(binary), bin2hex(binary))

end

end

return MainScene

4.详解

@H_390_0@mainScene类中主要的构造函数和其他处理函数。

构造函数创建3个Label分别是

Connect,send text,send binary.

该Label均可以点击,点击后分别调用

onConnectClicked,onSendTextClicked,onSendBinaryClicked函数。

其中:

onConnectClicked函数

判断是否才能在self.websocket变量,如果存在则返回,不存在则进行创建。

同时对创建返回的对象添加事件OPEN_EVENT,messaGE_EVENT,CLOSE_EVENT,ERROR_EVENT

具体如下:

if self.websocket then return end

self.websocket = WebSockets.new(@H_262_91@"ws://echo.websocket.org")

self.websocket:addEventListener(WebSockets.oPEN_EVENT, self.onOpen))

self.websocket:addEventListener(WebSockets.messaGE_EVENT, self.onmessagE))

self.websocket:addEventListener(WebSockets.CLOSE_EVENT, self.onClosE))

self.websocket:addEventListener(WebSockets.ERROR_EVENT, self.onError))

事件对应的函数是onOpen,onmessage,onClose,onError。

其中self.websocket = WebSockets.new(@H_262_91@"ws://echo.websocket.org") 命令是创建一个连接对象,地址@H_262_91@"ws://echo.websocket.org"@H_262_91@是测试网址。

这里主要需要介绍的是onmessage函数,该函数在接受到数据后调用,通过判断是否是BINARY_messaGE进行输出。

4.1onSendTextClicked函数

判断是否存在对象,如果存在则发送字符串。

4.2onSendBinaryClicked函数

同onSendTextClicked函数,不过发送的是二进制文件。

大佬总结

以上是大佬教程为你收集整理的quick-cocos2d-x 学习系列之十二 关于websocket全部内容,希望文章能够帮你解决quick-cocos2d-x 学习系列之十二 关于websocket所遇到的程序开发问题。

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

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