关于粘包问题,到网上找了一下,发现解决方法其实很多:
AMF3
http://www.klstudio.com/post/202.html
MINA自带的sumup例子
http://mina.apache.org/documentation.html
Apache SSHD
L potato中讨论AS3出现的粘包问题
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在
使用早期的同步机制(好像没有用并发库和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(类成员)截断以保留不完整的收包。
另外,还使用命令队列,包括空闲和激活队列。
待考
-----------------------------------------------
相关推荐
文件"MinaSocket"可能包含了实现上述功能的详细代码,包括服务端的Acceptor配置、过滤器设置、事件处理器编写,以及客户端的Socket连接、数据发送和接收等。通过阅读和理解这些代码,你可以更好地掌握Mina与Socket...
- **心跳机制**:为了检测连接是否断开,通常需要设置心跳包,定时发送和接收,防止连接因长时间无数据传输而被网络中间设备关闭。 - **线程安全**:在多线程环境下,需确保所有操作都是线程安全的,避免并发问题。...
在AndroidPN(Android Push Notification)项目中,由于需要实时地将服务器端的通知推送到客户端,Socket和Mina的运用显得尤为重要。Socket可以用于实现基本的推送服务,但考虑到Android设备的多样性和网络环境的...
MINA框架中的Socket服务端和客户端通过Socket接口实现数据的发送和接收,服务端创建监听Socket,等待客户端的连接请求;客户端则通过Socket连接到服务端,进行数据交互。 3. **服务端实现**:在MINA中,服务端通常...
Socket通讯和MINA应用是Java网络编程中的两个关键概念,它们在开发分布式系统、网络服务和客户端应用程序中扮演着重要...对于"testMina"项目,深入研究其代码结构和工作流程,将有助于巩固和深化对Socket和MINA的理解。
Socket和Mina是Java网络编程中的两个重要工具,它们在构建高性能、高并发的网络应用中发挥着关键作用。Socket是TCP/IP通信的基础,而Mina是一个高效的网络应用框架,它简化了网络编程的复杂性。 Socket,也被称为套...
一旦连接建立,就可以通过 Session 发送和接收数据。 7. **数据传输** Mina 提供了 I/O 编解码器来处理不同格式的数据,如文本、二进制等。在源代码中,你可能会看到自定义的 Codec 类,它们负责将应用程序对象与...
`TestConnector.java`和`SocketTest.java`可能包含了此类客户端的示例代码,展示如何创建和管理Socket连接,以及发送和接收数据的基本流程。 相比之下,Mina NIO是一种基于Java NIO API的网络通信框架,它利用了多...
Socket通信和MINA长连接是网络编程中的两个关键概念,主要应用于服务器与客户端之间的数据交互。...提供的压缩包文件"SOCKET通信"可能包含了使用Socket和MINA的示例代码和库文件,可以直接导入到项目中进行测试和使用。
总结起来,Apache Mina和Flex AS3.0的交互涉及到网络通信、数据交换、服务端和客户端API的使用、事件驱动编程以及安全性与性能优化等多个方面。这种交互方式为开发高效、功能丰富的跨平台应用程序提供了可能,使...
以上就是使用Java Mina框架创建一个简单的Socket服务端和客户端的实现。在实际应用中,可能还需要考虑异常处理、心跳机制、多线程处理、消息序列化与反序列化等问题。Mina提供的API非常灵活,可以根据需求进行扩展和...
- 在测试过程中,Mina框架会帮助捕获和处理网络通信中的异常,同时结合日志系统,记录关键信息,方便后期分析问题和优化。 9. **可扩展性**: - Mina测试框架允许自定义过滤器和处理器,方便扩展新的功能或适配...
6. **数据交换**:一旦连接建立,就可以通过Session对象发送和接收数据。 **总结:** Apache Mina 2.0.7提供了一个强大而灵活的框架,用于构建高性能的网络应用,特别是基于Socket的通信。通过理解其核心概念和...
1.mina socket客户度工程相关类,添加mina jar包后可独立运行。 2.mina若有空闲连接则使用已有连接,若无则新建mina连接; 3.mina空闲连接超过保活时间25分钟后,自动删除; 4.mina发送指令后,接收指定时长内收到的...
- 服务端:在Mina的处理器中,重写`sessionCreated()`, `messageReceived()`, `messageSent()`等方法,处理客户端连接、接收和发送数据。 - 客户端:通过Socket的输入/输出流读写数据,实现与服务端的通信。 4. *...
总的来说,通过SpringBoot集成Mina框架,我们可以构建一个高性能的Socket服务器,处理客户端的连接和数据交互。同时结合myBatis,可以方便地实现数据库操作,增强系统的业务处理能力。在实际开发中,我们还需要考虑...
3. **Mina发送文件** 发送文件的过程与图片类似,但可能需要考虑更多因素,如文件大小、文件类型等。Mina允许开发者自定义编码解码策略,因此可以根据需要选择合适的文件分块策略进行大文件传输。此外,为了保证...
Socket分为两种类型:基于TCP的面向连接的Socket和基于UDP的无连接的Socket。TCP Socket提供可靠的、基于字节流的数据传输,而UDP Socket则是一种无连接的服务,数据以数据报的形式发送,不保证顺序或可靠性,但具有...
在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...
mina简单示例,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速...