--
-- Author:
-- Date: 2015-04-26 10:53:55
--
SocketMessage = {}
net = require("framework.cc.net.init")


cc.utils = require("framework.cc.utils.init")


index10001 = 1


local isConnected = false --是否已建立连接
local isConnecting = false --是否真正建立连接
local isInited = false --是否初始化过连接


-- 消息体长度占4个字节
SocketMessage.BODY_LEN = 4


local ip = nil
local port = nil
-- 数据缓存
local buf = cc.utils.ByteArrayVarint.new(cc.utils.ByteArrayVarint.ENDIAN_BIG)


function SocketMessage:init()
local time = net.socketTCP.getTime()
print("socket time:" .. time)


local socket = net.socketTCP.new()
socket:setName("SocketTcp")
socket:setTickTime(0.001)
socket:setReconnTime(6)
socket:setConnFailTime(4)


print("version is "..net.socketTCP._VERSION)
net.socketTCP._DEBUG = true


socket:addEventListener(net.socketTCP.EVENT_DATA,handler(self,self.tcpData))
socket:addEventListener(net.socketTCP.EVENT_CLOSE,self.tcpClose))
socket:addEventListener(net.socketTCP.EVENT_CLOSED,self.tcpClosed))
socket:addEventListener(net.socketTCP.EVENT_CONNECTED,self.tcpConnected))
socket:addEventListener(net.socketTCP.EVENT_CONNECT_FAILURE,self.tcpConnectedFail))


self.socket_ = socket
end


function SocketMessage:Connect(_ip,_port)
print(" SocketMessage:Connect! ")
isConnecting = true
if isInited == false then --
isInited = true
self:init()
end
ip = _ip
port = _port
print(" 开始建立socket连接 ")
self.socket_:connect(ip,port,true)
end


--type 消息类型
function SocketMessage:SendSokcetData(_data,type)
-- local s = json.encode(_data)
-- if Globe_print then
-- print("发送消息" .. _data["cmd"] .. "==具体参数" ..s) -- for test lz
-- end
local c_byte = cc.utils.ByteArray.new(cc.utils.ByteArrayVarint.ENDIAN_BIG)
c_byte:writeStringBytes(_data)
c_byte:setPos(1)


local content_len = c_byte:getAvailable()
print(" the content_len is "..content_len)
local msg_byte = cc.utils.ByteArray.new(cc.utils.ByteArrayVarint.ENDIAN_BIG)
-- msg_byte:writeUInt(content_len)
msg_byte:writeUShort(content_len+4)
msg_byte:writeUShort(type)
msg_byte:writeStringBytes(_data)
-- msg_byte:writeString(s)
-- msg_byte:setPos(1)


print("发送数据 _dada is ".._data)
if self.socket_.isConnected then --
-- self.socket_:send(_data)
-- self.socket_:send(msg_byte:getPack(1,msg_byte:getAvailable()))
self.socket_:send(msg_byte:getPack())
print(" the pack is "..msg_byte:getPack())
else
print("socket 已经断开,正在重新连接! ")
self.socket_:connect(ip,true)
end
end


function SocketMessage:CloseSocket()
if self.socket_.isConnected then
self.socket_:close()
end
end


function SocketMessage.getBaseBA()
return cc.utils.ByteArrayVarint.new(cc.utils.ByteArrayVarint.ENDIAN_BIG)
end


local function _tick(msg)
local __msgs = {}
print("buf len is "..buf:getLen())
buf:setPos(buf:getLen()+1)
buf:writeBuf(msg)

buf:setPos(1)


while buf:getAvailable() >= SocketMessage.BODY_LEN do
local bodyLen = buf:readUShort()
print("bodyLen length is "..bodyLen)
local len2 = buf:readUShort()
print(" the data type is "..len2)
if buf:getAvailable() < bodyLen-4 then
buf:setPos(buf:getPos() - SocketMessage.BODY_LEN)
break
end
print(" the data is "..buf:readStringBytes(bodyLen-4))
local len3 = buf:getAvailable()
print(" the data len3 is "..len3)
-- __msgs[#__msgs+1] = buf:readStringBytes(bodyLen)
end

if buf:getAvailable() <= 0 then
buf = SocketMessage.getBaseBA()
else
local __tmp = SocketMessage.getBaseBA()
buf:readBytes(__tmp,1,buf:getAvailable())
buf = __tmp
end


return __msgs
end


function SocketMessage:tcpData(event)
local msgs = _tick(event.data)
print_lua_table(msgs)
if event.data ~= nil then
-- print("接收到的数据 data is "..event.data)
-- local data = cjson.decode(event.data)
-- if conditions then
-- --todo
-- end
-- Event_dispatchEvent(data.cmd,data)
else
print(" SocketMessage:tcpData is nil")
end

end



function SocketMessage:tcpClose()
print(" socket连接已经关闭! ")
end


function SocketMessage:tcpConnected()
print(" socket连接建立成功! ")
self:SendSokcetData("1",1000)
end


function SocketMessage:tcpConnectedFail()
print(" socket连接已经断开! ")
end


function SocketMessage:onExit()
if self.socket_.isConnected then
self.socket_:close()
end
self.socket_:disconnect()
end


return SocketMessage


quick-cocos2dx中使用socketTCP这个类,这个是zengrong写的。


1.读取socket的规则是*a,*a的规则是有多少读取多少,没有最大值

2.有一个tick_time,这个时候,是程序获取socket内读取到多少东西的时间间隔,这个时间间隔一般设置1秒

3.socket通信,使用的是.ByteArray的数据,需要处理粘包和半包,这两个问题

粘包的意思就是一次socket通信,同时发送了2个消息。客户端的表现就是获取的event.data中含有两个消息。

客户端的处理就是对每一个消息分别进行处理,这个比较简单。

半包的意思就是一次socket通信,只发送了部分消息。客户端的表现就是获取的event.data中消息的len包含的长度大于包的长度,

这个时候,这个包就没有收全,这个时候,不能调用解析处理包的逻辑。需要等待下次数据,把下次socket获取的数据加入到这部分消息的buf中,

然后,如果len小于等于新的包的长度,那么就可以调用处理包的逻辑,进行处理了。

quick-cocos2dx Socket连接若干问题总结的更多相关文章

  1. canvas中普通动效与粒子动效的实现代码示例

    canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。本文详细的介绍了粒子特效,和普通动效进行对比,非常具有实用价值,需要的朋友可以参考下

  2. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. canvas学习和滤镜实现代码

    这篇文章主要介绍了canvas学习和滤镜实现代码,利用 canvas,前端人员可以很轻松地、进行图像处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. localStorage的过期时间设置的方法详解

    这篇文章主要介绍了localStorage的过期时间设置的方法详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. 详解HTML5 data-* 自定义属性

    这篇文章主要介绍了详解HTML5 data-* 自定义属性的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. html5 http的轮询和Websocket原理

    这篇文章主要介绍了html5 http的轮询和Websocket原理的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. ios – Swift语言:如何调用SecRandomCopyBytes

    从Objective-C,我可以这样做:在Swift中尝试这个时,我有以下内容:但我得到这个编译器错误:data.mutableBytes参数被拒绝,因为类型不匹配,但我无法弄清楚如何强制参数.解决方法这似乎有效:

  10. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部