`
xqls
  • 浏览: 28016 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java通信(Netty、Mina2)【通信粘包的处理】、【数据协议】、【网络系统的安全性】

    博客分类:
  • Java
阅读更多
Netty、Mina2是非常优秀的javaNIO+ThreadPool线程池通信框架
http://www.cnblogs.com/51cto/archive/2010/09/06/1819361.html
提到通信就得面临两个问题,一是通信协议的选择,二是数据协议的定义。通信协议耳熟能详的就有好几种,TCP,UDP,HTTP,FTP等等。数据协议是一种数据交换的格式,像jason,xml,amf3,google protocol都可以用作数据协议,你也可以自己根据通信的效率,安全等因素来定义自己的数据协议。

  通信系统的开发是一项很复杂的工作,不要以为往发服务端发一个Hello World!就认为完全掌握了通信系统的开发。概括来说要开发一个健壮的通信系统,必须从这几个方面来着手。

  一,通信粘包的处理

  这里包的概念是逻辑上的数据包,也就是我们发送的一个完整业务消息包,粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包。不是所有的粘包现象都需要处理,若传输的数据为不带结构的连续流数据(如文件传输),则不必把粘连的包分开(简称分包)。但在实际工程应用中,传输的数据一般为带结构的数据,这时就需要做分包处理。

  为了避免粘包现象,可采取以下几种措施。一是对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。

  以上提到的三种措施,都有其不足之处。总的来说降低了通信系统的吞吐量。我们可以自己设计一个分包算法来处理粘包的问题,该算法的实现是这样的:

   1. 当有数据到达时,将数据压入程序缓冲区。
   2. 循环处理缓冲区,如果缓冲区长度大于包头长度,则取出长度信息n,否则跳出循环,如果缓冲区的长度大于n,则从缓冲区取出一个完整包进行处理,否则跳出循环。

如果你是Java的爱好都可以参考一下Mina和netty2的实现,像Mina和Netty2都提供了粘包处理类可供使用,像Mina的CumulativeProtocolDecoder类,Netty2的LengthFieldBasedFrameDecoder。

  二,数据协议选择

  现在已经有很多数据协议可供我们选择,像jason,xml,amf3,google protocol等等,这些协议相应的语言都有API来对自身数据做协议处理,我们选择协标准无非就是效率和大小,这里每个人可以根据实际的应用环境选择适合的数据协议。

  三,网络系统的安全性

  网络安全是一个永远的话题,对通信数据加密一般常RSA对byte流加密,FLOOD验证,IP黑名单验证都是必须考虑到的。

  以上是做网络开发必须了解的一些基础知识,在这里我们使用一个具体的实例来加深一下理解,Java与Flex使用AMF3数据协议通信。做过网络开发的一般都会知道套接字(SOCKET),很多语言都会通SOCKET来提供对网络操作的API,Java的提供的NIO SOCKET是一个高效的异步通信API,当然可以在这个基础上来开发我们的网络应用,但这种Native API需要我们花很多精力来处理网络通信的细节,消弱了我们对业务的关心。为我们开发带来很多不便性,幸好Java有很多现成的NIO SOCKET框架可供使用,像Mina,Netty2,xSocket等等,这些框架处理了很多底层的通信问题,提供了一些易用的API以供使用。在这个实例中我们使用Netty2来做通信框架。
分享到:
评论

相关推荐

    Java Netty 分布式开发 框架

    Netty的组件和设计使其在分布式系统的网络通信中表现出色,比如处理消息分段、粘包和半包问题、心跳检测、重连机制等。它的扩展性允许开发者针对特定的业务需求开发插件。例如,在处理用户登录时,可以添加一个...

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...

    Java Netty-入门教程.pdf

    这些框架之所以选择 Netty,主要是因为其在网络通信方面提供了高性能、高可靠性的解决方案,能够满足大规模分布式系统的通信需求。 ##### 1.4 Netty 的优势 - **相比于传统的 NIO**: - 减少了开发者的工作量,...

    Java面试题10道Java高级必备的Netty面试题!.pdf

    Netty作为一款高性能、异步事件驱动的网络应用程序框架,为Java开发者提供了构建服务器和客户端应用的强大工具。针对Java高级开发者,深入理解Netty对于提升技术水平和解决复杂问题至关重要。以下是十道关于Netty的...

    Voovan开发手册

    - **起源**:Voovan项目起源于开发者在使用Netty和Mina框架过程中遇到的一些难点和困惑,尤其是关于粘包等问题的处理。这促使开发者进一步研究Java异步通信机制,并最终决定基于Java 1.7之后引入的AIO(Asynchronous...

Global site tag (gtag.js) - Google Analytics