`

MINA和AS3的socket接收问题

阅读更多

关于粘包问题,到网上找了一下,发现解决方法其实很多:

 

AMF3

http://www.klstudio.com/post/202.html

 

MINA自带的sumup例子

http://mina.apache.org/documentation.html

 

Apache SSHD

http://mina.apache.org/sshd/

 

L potato中讨论AS3出现的粘包问题

http://code.google.com/p/lpotato/source/browse/trunk/java/toolkit/WebContent/test/flash/SocketBridge.as?r=13

 

hudo实现sgs客户端时处理ProgressEvent.SOCKET_DATA事件的方法

http://code.google.com/p/hudo/

 

darkstar-as3也处理过类似的问题,不过方法略有不同,似乎叫payload(意思叫有效载荷)

http://code.google.com/p/darkstar-as3/

 

总而言之,处理二进制流数据时不写循环是不严谨的,由于naggle算法的影响

http://zh.wikipedia.org/zh-cn/%E7%B4%8D%E6%A0%BC%E7%AE%97%E6%B3%95

网速会导致数据包的大小是无法预计的,因此读数据算法需要慎重考虑(尤其是非文本协议)。

MINA和AS3存在类似的问题,你可以延迟读出和连续读出,维护一个状态值,但基于性能问题,

最好不要在这方面使用耗时的操作——MINA的receive会阻塞会话,而flash也会阻塞enterFrame。

 

方法其实还有很多,例如使用分界字符。NIO使socket和线程不再是一对一而是一对多,而flash的异步网络读写更是让人耳目一新,觉得自己要熟练掌握这些技术还需要付出更大的努力。

 

 

 

 

 

-------------------------------------------------

 

 

20100720 update:

 

* 使用base64,直接用文本模式通信(服务器和客户端需要做base64的编解码)

可以参考f3server的代码

http://code.google.com/p/f3server/

 

按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)

 

代价:数据量大了,只能防君子。

好处:用文本传输任意二进制数据,不再限于文本。

 

f3server没有添加ssl的支持(估计很想这么做),如果程序开发者觉得安全不重要,可以考虑用这种base64的方法避开mina的粘包问题。(题外话——我对base64和字符串操作没信心,对于正则表达式完全是白痴,还是用纯二进制传输好了,虽然写mina的自定义协议很让人抓狂)

 

 

-------------------------------------------------

 

20100819 update:

 

如果你对客户端数据解析有复杂需求,并且需要实时处理,可以参考《Actionscript 3.0宝典》介绍的一个开源项目的代码。

FVNC

http://code.google.com/p/fvnc/

这是一个远程桌面的flash客户端。

它实现数据接收队列和循环协议解析。

由于实现得过于繁琐而且考虑大数据传输,

个人认为这不是一种实用的解决方法。

但如果对数据结构有高级别的认识(我级别还不够高= =b)可以考虑用svn下载这份代码。

另外,它对网络协议层的封装方法也比较规范和标准。

 

 

-------------------------------------------------

 

20100830 update:

as3chat

http://code.google.com/p/as3chat/

客户端as中接收与发送数据,貌似是socket+xml,但不太明白为什么不直接使用xmlsocket?

 

 

 

--------------------------------------------------

 

20101013 update:

 

还发现一个写得很规范的AS3库,用于解析sgs的pack格式socket数据包:

yadaa (Yet Another Darkstar ActionScript API)

http://code.google.com/p/yadaa/

 

收数据的关键代码在com.plamentotev.yadaa.client.PDSClient

的processServerMessage()

和onData监听器中,

特点是使用while轮询消除粘包。

使用Logger记录日志,

使用if(this.dataBuffer.bytesAvailable < msgSize)和倒退position延迟处理实现包的合并。

processServerMessage()只能获得包的复制内存。

每次轮询读包后总是要分配新的ByteArray,即使还有剩余数据,也要转移到新的ByteArray。

 

 

 

----------------------------------------------

20110130 update

 

Adobe Flex SDK的fdb调试器

 

svn在

http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/debugger/src/java/flash/tools/debugger/concrete/DProtocol.java

 

 

使用早期的同步机制(好像没有用并发库和ByteBuffer),使用循环消除分裂的接收包。

使用包长度和命令整数机制。

使用小对象缓存(用不同长度byte[]的DMessage缓存不同长度的收包)。

 

(有些书认为在Java中没必要使用池,只对于创建代价太高的对象如线程、数据库连接才应该使用池。

他们认为池阻碍Java虚拟机执行GC,因为池内的对象因为引用而不会被GC。

另一方面,他们认为Java虚拟机本身就有机制可以防止内存碎片和快速分配释放内存,没必要手工做这样的事情。

所以我觉得最好自己实测一下)

 

----------------------------------------------

20110228 update:

 

rpggamelib:

ProgressEvent.SOCKET_DATA事件句柄中循环读socket以消除粘包

 

http://code.google.com/p/rpggamelib/

 

http://rpggamelib.googlecode.com/svn/trunk/net/rpg/core/net/NetPack.as

 

 

-----------------------------------------------

20110320 update:

 

as3redis:

https://github.com/claus/as3redis

 

我不是太了解包的结构,但是可以看到Redis.as文件中的监听器

protected function dataHandler(e:ProgressEvent):void

中使用while消除分裂包,

使用commandProcessed布尔变量等待下一次接收,

最后的长度判断用于把持久的状态值buffer(类成员)截断以保留不完整的收包。

另外,还使用命令队列,包括空闲和激活队列。

 

待考

-----------------------------------------------

 

分享到:
评论

相关推荐

    Mina+Socket通信

    文件"MinaSocket"可能包含了实现上述功能的详细代码,包括服务端的Acceptor配置、过滤器设置、事件处理器编写,以及客户端的Socket连接、数据发送和接收等。通过阅读和理解这些代码,你可以更好地掌握Mina与Socket...

    Android-MinaSocket一款基于Mina的Socket长连接库

    - **心跳机制**:为了检测连接是否断开,通常需要设置心跳包,定时发送和接收,防止连接因长时间无数据传输而被网络中间设备关闭。 - **线程安全**:在多线程环境下,需确保所有操作都是线程安全的,避免并发问题。...

    Socket及Mina的讲解

    在AndroidPN(Android Push Notification)项目中,由于需要实时地将服务器端的通知推送到客户端,Socket和Mina的运用显得尤为重要。Socket可以用于实现基本的推送服务,但考虑到Android设备的多样性和网络环境的...

    mina框架中socket使用,有服务端和客户端。

    MINA框架中的Socket服务端和客户端通过Socket接口实现数据的发送和接收,服务端创建监听Socket,等待客户端的连接请求;客户端则通过Socket连接到服务端,进行数据交互。 3. **服务端实现**:在MINA中,服务端通常...

    socket通讯和mina应用

    Socket通讯和MINA应用是Java网络编程中的两个关键概念,它们在开发分布式系统、网络服务和客户端应用程序中扮演着重要...对于"testMina"项目,深入研究其代码结构和工作流程,将有助于巩固和深化对Socket和MINA的理解。

    socket 与 mina 交互数据

    Socket和Mina是Java网络编程中的两个重要工具,它们在构建高性能、高并发的网络应用中发挥着关键作用。Socket是TCP/IP通信的基础,而Mina是一个高效的网络应用框架,它简化了网络编程的复杂性。 Socket,也被称为套...

    Mina Socket 源代码

    一旦连接建立,就可以通过 Session 发送和接收数据。 7. **数据传输** Mina 提供了 I/O 编解码器来处理不同格式的数据,如文本、二进制等。在源代码中,你可能会看到自定义的 Codec 类,它们负责将应用程序对象与...

    一般Socket客户端与Mina NIO Socket客户端对比示例

    `TestConnector.java`和`SocketTest.java`可能包含了此类客户端的示例代码,展示如何创建和管理Socket连接,以及发送和接收数据的基本流程。 相比之下,Mina NIO是一种基于Java NIO API的网络通信框架,它利用了多...

    socket通信,mina长连接通信

    Socket通信和MINA长连接是网络编程中的两个关键概念,主要应用于服务器与客户端之间的数据交互。...提供的压缩包文件"SOCKET通信"可能包含了使用Socket和MINA的示例代码和库文件,可以直接导入到项目中进行测试和使用。

    apache Mina和Flex as3.0 交互

    总结起来,Apache Mina和Flex AS3.0的交互涉及到网络通信、数据交换、服务端和客户端API的使用、事件驱动编程以及安全性与性能优化等多个方面。这种交互方式为开发高效、功能丰富的跨平台应用程序提供了可能,使...

    mina 服务器socket客服端发消息

    以上就是使用Java Mina框架创建一个简单的Socket服务端和客户端的实现。在实际应用中,可能还需要考虑异常处理、心跳机制、多线程处理、消息序列化与反序列化等问题。Mina提供的API非常灵活,可以根据需求进行扩展和...

    socket mina测试框架

    - 在测试过程中,Mina框架会帮助捕获和处理网络通信中的异常,同时结合日志系统,记录关键信息,方便后期分析问题和优化。 9. **可扩展性**: - Mina测试框架允许自定义过滤器和处理器,方便扩展新的功能或适配...

    apache mina socket

    6. **数据交换**:一旦连接建立,就可以通过Session对象发送和接收数据。 **总结:** Apache Mina 2.0.7提供了一个强大而灵活的框架,用于构建高性能的网络应用,特别是基于Socket的通信。通过理解其核心概念和...

    mina socket客户度工程相关类

    1.mina socket客户度工程相关类,添加mina jar包后可独立运行。 2.mina若有空闲连接则使用已有连接,若无则新建mina连接; 3.mina空闲连接超过保活时间25分钟后,自动删除; 4.mina发送指令后,接收指定时长内收到的...

    java客户端socket与mina服务端通信

    - 服务端:在Mina的处理器中,重写`sessionCreated()`, `messageReceived()`, `messageSent()`等方法,处理客户端连接、接收和发送数据。 - 客户端:通过Socket的输入/输出流读写数据,实现与服务端的通信。 4. *...

    MinaDemo.zip SpringBoot集成Socket通讯

    总的来说,通过SpringBoot集成Mina框架,我们可以构建一个高性能的Socket服务器,处理客户端的连接和数据交互。同时结合myBatis,可以方便地实现数据库操作,增强系统的业务处理能力。在实际开发中,我们还需要考虑...

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    3. **Mina发送文件** 发送文件的过程与图片类似,但可能需要考虑更多因素,如文件大小、文件类型等。Mina允许开发者自定义编码解码策略,因此可以根据需要选择合适的文件分块策略进行大文件传输。此外,为了保证...

    网络编程(socket、NIO、mina)---demo

    Socket分为两种类型:基于TCP的面向连接的Socket和基于UDP的无连接的Socket。TCP Socket提供可靠的、基于字节流的数据传输,而UDP Socket则是一种无连接的服务,数据以数据报的形式发送,不保证顺序或可靠性,但具有...

    基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...

    apache mina socket实例

    mina简单示例,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速...

Global site tag (gtag.js) - Google Analytics