对qucik cocos2dx lua SocketTCP的再一次封装,导入全局实例,包含自定义事件

来源:互联网 发布:数据情报 编辑:程序博客网 时间:2024/05/01 23:17

刚学习了lua两三天,对socket通信做了个自己的封装,导入全局实例,加入自定义事件分发,请大家多多指教

---- Author: peilin-- Date: 2015-01-22 11:10:35--local Component = require("framework.cc.components.Component")local SocketTCP = require("framework.cc.net.SocketTCP")local SERVER_IP = "127.0.0.1"local SERVER_PORT = 8888local OlafSocket = class("OlafSocket", Component)--OLAF EVENTOlafSocket.EVENT_CLOSE = "SOCKET_TCP_CLOSE"OlafSocket.EVENT_CLOSED = "SOCKET_TCP_CLOSED"OlafSocket.EVENT_CONNECTED = "SOCKET_TCP_CONNECTED"OlafSocket.EVENT_CONNECT_FAILURE = "SOCKET_TCP_CONNECT_FAILURE"OlafSocket.EVENT_OLAF_DATA = "OLAF_DATA"function OlafSocket:ctor(__name,...)self.name = __name or 'OlafSocket'self.host = SERVER_IPself.port = SERVER_PORTself.isRetryConnect = falseself.isConnected = falseself.listener = {}self.nextListenerID = 0self.socket = SocketTCP.new(self.host, self.port, self.isRetryConnect)self.socket:addEventListener(SocketTCP.EVENT_CONNECTED, handler(self, self.onStatus))self.socket:addEventListener(SocketTCP.EVENT_CLOSE, handler(self,self.onStatus))self.socket:addEventListener(SocketTCP.EVENT_CLOSED, handler(self,self.onStatus))self.socket:addEventListener(SocketTCP.EVENT_CONNECT_FAILURE, handler(self,self.onStatus))self.socket:addEventListener(SocketTCP.EVENT_DATA, handler(self,self.onData))endfunction OlafSocket:connect(obj)if 'table' ~= type(obj) then        printError("OlafSocket:connect require parameter 1 to be a table")        return nil    endassert(obj.socket,"Invalid socket object")obj.socket:connect()return trueendfunction OlafSocket:disConnect( obj )if 'table' ~= type(obj) then        printError("OlafSocket:connect require parameter 1 to be a table")        return nil    end    if not obj.socket then return nil end    print("disconnect()")    obj.socket:disconnect()    return trueendfunction OlafSocket:dispatchEvent(__event)if 'table' ~= type(__event) thenprintError("OlafSocket:dispatchEvent() - invalid param")return nilendif self.listener[__event.name] == nil thenif DEBUG > 1 thenprintInfo("event name :%s no listener.", __event.name)endreturn trueendfor id,listener in pairs(self.listener[__event.name]) do-- listener[1] = handler()-- listener[2] = tagret = listener[1](__event)if __event.stop == true and ret == true then breakendendreturn trueendfunction OlafSocket:onStatus(__status)if __status.name == SocketTCP.EVENT_CONNECTED thenself.isConnected = trueendif __status.name == SocketTCP.EVENT_CLOSED thenself.isConnected = falseendret =  self:dispatchEvent({name = __status.name,stop = true})return retendfunction OlafSocket:onData( __data )ret = self:dispatchEvent({name = OlafSocket.EVENT_OLAF_DATA,stop = true,data = __data.data})return retendfunction OlafSocket:addListener(obj, __eventName, __listener,tag)if 'table' ~= type(obj) then        printError("OlafSocket:addListener require parameter 1 to be a table")        return nil    endassert(type(__eventName) == "string" and __eventName ~= "",        "OlafSocket:addListener() - require parameter 2 to be a string")if obj.listener[__eventName] == nil thenobj.listener[__eventName] = {}end-- listener[1] = handler()-- listener[2] = tagtag = tag or ""obj.nextListenerID = obj.nextListenerID + 1obj.listener[__eventName][obj.nextListenerID] = {__listener,tag}return trueendfunction OlafSocket:removeListeners(obj,__listener)if 'table' ~= type(obj) then        printError("OlafSocket:sendData require parameter 1 to be a table")        return nil    end    for event,handlers in pairs(obj.listener) do    for listenerID,listener in pairs(handlers) do    if listener[1] == __listener then    handlers[listenerID] = nil    end    end    end    return trueendfunction OlafSocket:removeListenersByTag(obj,__tagToRemove)if 'table' ~= type(obj) then        printError("OlafSocket:sendData require parameter 1 to be a table")        return nil    end    for event,handlers in pairs(obj.listener) do    for listenerID,listener in pairs(handlers) do    if listener[2] == __tagToRemove then    handlers[listenerID] = nil    end    end    end    return trueendfunction OlafSocket:removeListenersByEvent(obj,__eventToRemove)if 'table' ~= type(obj) then        printError("OlafSocket:sendData require parameter 1 to be a table")        return nil    end    obj.listener[__eventToRemove] = nil    return trueendfunction  OlafSocket:removeAllListener( obj )if 'table' ~= type(obj) then        printError("OlafSocket:sendData require parameter 1 to be a table")        return nil    end    obj.listener = nilendfunction OlafSocket:sendData(obj, __data)if 'table' ~= type(obj) then        printError("OlafSocket:sendData require parameter 1 to be a table")        return nil    endif DEBUG > 1 thenprintInfo("Send Data")for k,v in pairs(__data) doprint(k,v)endendif obj.isConnected == false thenprintError("OlafSocket:sendData require connect first")return nilendobj.socket:send(__data)return trueend-- register global _GOlafSocket.global = OlafSocket.new("OlafSocket_G")function OlafSocket.global:connect()return OlafSocket:connect(self)endfunction OlafSocket.global:disConnect()return OlafSocket:disConnect(self)endfunction OlafSocket.global:sendData(__data)return OlafSocket:sendData(self, __data)endfunction OlafSocket.global:addListener(__eventName, __listener)return OlafSocket:addListener(self, __eventName, __listener)endfunction OlafSocket.global:removeListeners( __listener )return OlafSocket:removeListeners(self,__listener)endfunction OlafSocket.global:removeListenersByTag(__tagToRemove)return OlafSocket:removeListenersByTag(self,__tagToRemove)endfunction OlafSocket.global:removeListenersByEvent( __event )return OlafSocket:removeListenersByEvent(self,__event)endfunction OlafSocket.global:removeAllListener()return OlafSocket:removeAllListener(self)end_G.OlafNet = _G.OlafNet or {}_G.OlafNet.OlafSocket = OlafSocketreturn OlafSocket


0 0
原创粉丝点击