16
17
18
19
20
21
22
23
@H_41_197@
24
25
26
27
28
29
30
functionscnet.send(msgid,data)
--encodeData此方法是根据需要发送的数据安装与服务器定义好的消息格式去write
local_ba=scnet.encodeData(msgid,data)
"scnet.send_ba"
,_ba:getLen())
"发送数据出错了......."
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,msgid)
return
end
--把数据读出来,加密
for
i=1,#_ba._buf
do
localtmpBit=String.byte(_ba:readRawByte())
byteCount=byteCount+tmpBit
tmpBit=bit.band(tmpBit+80,255)
tmpBit=bit.band(bit.bnot(bit.band(tmpBit,255)),255)
byteList<i>=tmpBit
end
byteCount=byteCount%256
localresult=ByteArray.
(ByteArray.ENDIAN_BIG)
result:writeShort(_ba:getLen()+3)
result:writeByte(byteCount)
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,#byteList
do
result:writeByte(byteList<i>)
end
--把数据发送给服务器
@H_197_339@
scnet.socket:send(result:getPack())
-- 根据messagEID来确定数据格式
functionscnet.encodeData(msgid,monospace!important; font-size:1em!important; min-height:auto!important; color:black!important; BACkground:none!important">msgidthen
localba=ByteArray.
(ByteArray.ENDIAN_BIG)
localfmt=InfoutIl:getmsgFmt(msgid)--此处为读取消息格式看下面的messageType里面会有定义
ba:writeStringUShort(
"token"
)--此处为用户token,没有就为
""
,此处可以判断用户是否重新登陆啊等等.......
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,#fmt
do
scnet.writeData(ba,fmt<i>,data)
localbaLength=ba:getLen()
localbt=ByteArray.
(ByteArray.ENDIAN_BIG)
bt:writeShort(baLength+4)--2为messagelength2为messagetype
bt:writeShort(msgid)
bt:writeBytes(ba)
return
bt
end
-- write 数据
28
functionscnet.writeData(ba,msg_type,monospace!important; font-size:1em!important; min-height:auto!important; BACkground:none!important">
localkey=msg_type.key
"scnet.writeData"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"key"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,key)
keyanddata[key]then
local_type=msg_type[
"fmt"
]
_type==
then
elseif_type==
"number"
then
"int"
then
"short"
then
end
else
ba:writeShort(#data[key])
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,#_type
do
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,_type<i>,v)
end
end
end
else
"找不到对应的key"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,msg_type.key,data)
end
-- 读取数据
-- 接收消息
12
functionscnet.receive(event)
(ByteArray.ENDIAN_BIG)
ba:writeBuf(event.data)
--有连包的情况,所以要读取数据
while
ba:getAvailable()<=ba:getLen()
scnet.decodeData(ba)
break
end
end
-- 消息数据解析
@H_525_ 616@
24
functionscnet.decodeData(ba)
local@R_369_10586@l=ba:readByte()--一个用于验证的数子
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,len-3
do
--去除前两个长度
localtmpBit=ba:readByte()
localenByte=scnet.decodeByte(tmpBit)
tmp@R_369_10586@l=tmp@R_369_10586@l+enByte
byteList<i>=enByte
end
(ByteArray.ENDIAN_BIG)
do
result:writeRawByte(String.
char
(byteList<i>))
end
(tmp@R_369_10586@l%256)==@R_369_10586@lthen
scnet.decodeMsg(result)
else
"scnet.decodeData@R_369_10586@lerror"
)
end
-- 根据格式解析数据
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
functionscnet.decodeMsg(byteArray)
localmsgid=byteArray:readShort()
do
scnet.readData(byteArray,rData)
end
"resulthandlerishere"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,rData[key])
return
else
NetManager:receiveMsg(msgid,rData)
end
--readData
functionscnet.readData(ba,data)
localkey=msg_type.key
keythen
]
then
then
data[key]=ba:readStringUShort()
then
then
@H_197_339@
data[key]=ba:readInt()
then
end
key==
then--当结果不为零的时候,说明有错误
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,data[key])
return
end
end
else
local_len=ba:readShort()--读取数组长度
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,_len
do
j=1,153)!important; BACkground:none!important">do
scnet.readData(ba,_type[j],tmp)
end
table.insert(data[key],tmp)
end
end
else
"找不到对应的keyscnet.readData"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,data)
end
@H_616_1015@
-- 数据解密
5
functionscnet.decodeByte(bytE)
localtmp=bit.band(bit.bnot(bit.band(byte,255)
tmp=bit.band((tmp+256-80),255)
tmp
消息格式
46
--发送
@H_343_21 @msgFmt[
"1001"
]={
key=
"list"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"id"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,fmt=
"int"
},
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"level"
"int"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"sex"
"int"
}
}
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"userid"
"int"
}
}
--返回
"int"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
@H_197_339@
{
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"int"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"int"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
"int"
}
}
}
}
|
网络管理NetManager
管理网络的发送与接收
58
59
--初始化
functionNetManager:init()
scnet.init()
scnet.connect(host,port)
end
--注册消息
--注册之后接受到服务器消息之后进行广播,谁注册,谁相应
functionNetManager:registerMsg(msgid,callBACk)
self._listenerList[msgid]=self._listenerList[msgid]or{}
localisExist=self:findCallBACk(msgid,callBACk)
notisExistthen
table.insert(self._listenerList[msgid],callBACk)
--移除注册消息
functionNetManager:removeRegister(msgid,callBACk)
self._listenerList[msgid]then
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,vinpairs(self._listenerList)
do
self._listenerList[msgid][k]=nil
end
end
@H_197_339@
end
--发送消息
--整理数据发送给服务器
functionNetManager:sendMsg(msgid,data)
scnet.send(msgid,data)
end
--接受消息
--派发事件(数据)
functionNetManager:receiveMsg(msgid,data)
self._listenerList[msgid]then
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,vinpairs(self._listenerList[msgid])
do
v(data)
end
end
end
functionNetManager:findCallBACk(msgid,callBACk)
do
return
true
end
end
@H_616_1015@
false
test
19
--监听事件
functionMainScene:onEnter()
NetManager:registerMsg(MsgType.SC_LOGIN,handler(self,self.receiveHandler))
end
--移除坚挺
functionMainScene:onExit()
NetManager:removeRegister(MsgType.SC_LOGIN,self.receiveHandler))
end
--发送数据,根据MsgFmt构造数据
table.insert(data.list,{id=1001,name=
"小房"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,level=1,sex=1})
"小田"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,level=11,sex=2})
"2222"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,level=21,sex=1})
"3333"
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,level=31,sex=2})
data.userid=10001
NetManager:sendMsg(MsgType.CS_LOGIN,data)
|
大佬总结
以上是大佬教程为你收集整理的Quick-cocos2d-x v3.3 SocketTCP链接全部内容,希望文章能够帮你解决Quick-cocos2d-x v3.3 SocketTCP链接所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。 如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
| | | | | | |