刚学习了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 = 8888
- local OlafSocket = class("OlafSocket",Component)
- --OLAF EVENT
- OlafSocket.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_IP
- self.port = SERVER_PORT
- self.isRetryConnect = false
- self.isConnected = false
- self.listener = {}
- self.nextListenerID = 0
- self.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,self.onStatus))
- self.socket:addEventListener(SocketTCP.EVENT_CLOSED,self.onStatus))
- self.socket:addEventListener(SocketTCP.EVENT_CONNECT_FAILURE,self.onStatus))
- self.socket:addEventListener(SocketTCP.EVENT_DATA,self.onData))
- end
- function OlafSocket:connect(obj)
- if 'table' ~= type(obj) then
- printError("OlafSocket:connect require parameter 1 to be a table")
- return nil
- end
- assert(obj.socket,"Invalid socket object")
- obj.socket:connect()
- return true
- end
- function 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 true
- end
- function OlafSocket:dispatchEvent(__event)
- if 'table' ~= type(__event) then
- printError("OlafSocket:dispatchEvent() - invalid param")
- return nil
- end
- if self.listener[__event.name] == nil then
- if DEBUG > 1 then
- printInfo("event name :%s no listener.",__event.name)
- end
- return true
- end
- for id,listener in pairs(self.listener[__event.name]) do
- -- listener[1] = handler()
- -- listener[2] = tag
- ret = listener[1](__event)
- if __event.stop == true and ret == true then
- break
- end
- end
- return true
- end
- function OlafSocket:onStatus(__status)
- if __status.name == SocketTCP.EVENT_CONNECTED then
- self.isConnected = true
- end
- if __status.name == SocketTCP.EVENT_CLOSED then
- self.isConnected = false
- end
- ret = self:dispatchEvent({name = __status.name,stop = true})
- return ret
- end
- function OlafSocket:onData( __data )
- ret = self:dispatchEvent({name = OlafSocket.EVENT_OLAF_DATA,stop = true,data = __data.data})
- return ret
- end
- function OlafSocket:addListener(obj,__eventName,__listener,tag)
- if 'table' ~= type(obj) then
- printError("OlafSocket:addListener require parameter 1 to be a table")
- return nil
- end
- assert(type(__eventName) == "string" and __eventName ~= "","OlafSocket:addListener() - require parameter 2 to be a string")
- if obj.listener[__eventName] == nil then
- obj.listener[__eventName] = {}
- end
- -- listener[1] = handler()
- -- listener[2] = tag
- tag = tag or ""
- obj.nextListenerID = obj.nextListenerID + 1
- obj.listener[__eventName][obj.nextListenerID] = {__listener,tag}
- return true
- end
- function 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 true
- end
- function OlafSocket:removeListenersByTag(obj,__tagToRemove)
- if 'table' ~= type(obj) then
- printError("OlafSocket:sendData require parameter 1 to be a table")
- return nil
- end
- for event,listener in pairs(handlers) do
- if listener[2] == __tagToRemove then
- handlers[listenerID] = nil
- end
- end
- end
- return true
- end
- function 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 true
- end
- function OlafSocket:removeAllListener( obj )
- if 'table' ~= type(obj) then
- printError("OlafSocket:sendData require parameter 1 to be a table")
- return nil
- end
- obj.listener = nil
- end
- function OlafSocket:sendData(obj,__data)
- if 'table' ~= type(obj) then
- printError("OlafSocket:sendData require parameter 1 to be a table")
- return nil
- end
- if DEBUG > 1 then
- printInfo("Send Data")
- for k,v in pairs(__data) do
- print(k,v)
- end
- end
- if obj.isConnected == false then
- printError("OlafSocket:sendData require connect first")
- return nil
- end
- obj.socket:send(__data)
- return true
- end
- -- register global _G
- OlafSocket.global = OlafSocket.new("OlafSocket_G")
- function OlafSocket.global:connect()
- return OlafSocket:connect(self)
- end
- function OlafSocket.global:disConnect()
- return OlafSocket:disConnect(self)
- end
- function OlafSocket.global:sendData(__data)
- return OlafSocket:sendData(self,__data)
- end
- function OlafSocket.global:addListener(__eventName,__listener)
- return OlafSocket:addListener(self,__listener)
- end
- function OlafSocket.global:removeListeners( __listener )
- return OlafSocket:removeListeners(self,__listener)
- end
- function OlafSocket.global:removeListenersByTag(__tagToRemove)
- return OlafSocket:removeListenersByTag(self,__tagToRemove)
- end
- function OlafSocket.global:removeListenersByEvent( __event )
- return OlafSocket:removeListenersByEvent(self,__event)
- end
- function OlafSocket.global:removeAllListener()
- return OlafSocket:removeAllListener(self)
- end
- _G.OlafNet = _G.OlafNet or {}
- _G.OlafNet.OlafSocket = OlafSocket
- return OlafSocket