`
xqls
  • 浏览: 27309 次
  • 性别: 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实现基于DTU的TCP服务器 + 多端口 + 多协议

    本文将深入探讨如何使用Java的Netty框架实现一个基于DTU(Data Transfer Unit)的TCP服务器,该服务器具备多端口通信和多协议解析的能力。 首先,DTU是一种专门用于远程数据传输的设备,它能够通过GPRS、3G/4G等...

    使用Netty解决TCP粘包和拆包问题过程详解

    Netty是一个流行的Java网络编程框架,提供了简洁、灵活的API来处理网络编程的各种问题。其中,解决TCP粘包和拆包问题是Netty的一个重要应用场景。本文将详细介绍使用Netty解决TCP粘包和拆包问题的过程。 TCP粘包和...

    JAVA netty 获取串口数据并且下发数据

    在标题中提到的“JAVA Netty 获取串口数据并且下发数据”,这意味着我们将探讨如何利用Netty来处理串行通信,特别是在与传感器交互的场景下。 串口通信,通常指的是通过串行端口进行的数据交换,广泛应用于工业自动...

    Netty精粹之TCP粘包拆包问题

    在网络通信领域,尤其是在基于TCP协议的应用程序开发中,经常会遇到“粘包”和“拆包”的问题。这些问题虽然属于较为底层的技术细节,但对于保障数据传输的准确性和完整性至关重要。本文将深入探讨TCP粘包拆包的概念...

    Netty粘包分包服务器端客户端完整例子

    在IT行业中,网络编程是至关重要的一个领域,特别是在开发高性能、低延迟的系统时。...通过实践和学习这个项目,你可以深入理解Netty如何帮助我们优雅地处理粘包和分包问题,提升网络通信的效率和可靠性。

    基于Netty的Java数据采集软件

    本文将深入探讨一个基于Netty的Java数据采集软件,它利用Netty强大的网络通信框架,实现了对大规模分布式数据节点的高效采集。 Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于服务器开发,特别是...

    Java学习之IO总结及mina和netty

    Java的输入/输出(IO)系统是其强大功能的关键组成部分,尤其在处理数据传输和网络通信方面。在本文中,我们将深入探讨Java IO,并结合MINA和Netty这两个流行的网络编程框架进行分析。 首先,Java IO提供了丰富的...

    netty 数据分包、组包、粘包处理机制(部分)1

    Netty 数据分包、组包、粘包处理机制 Netty 中的 LengthFieldBasedFrameDecoder 是一种常用的处理大数据分包传输问题的解决类。该类提供了多种参数来调整帧的解码方式,从而满足不同的应用场景。 1. maxFrame...

    基于java netty的udp客户端声呐数据对接

    在"基于Java Netty的UDP客户端声呐数据对接"项目中,我们主要关注如何利用Netty处理UDP通信,以及如何解析和封装SCANFISH-II型声呐系统的数据。 UDP(User Datagram Protocol)是一种无连接的传输层协议,它不保证...

    netty解析报文,解决粘包拆包

    注:下载前请查看本人博客文章,看是否...里面包含模拟TCP客户端发送报文工具,硬件厂商提供的协议,服务端(springboot+netty)解析报文源码,源码里整合了redis,不需要可自行删除,如有需要客户端代码,可联系我。

    c++客户端和java(Netty)服务器端tcp通讯

    在IT行业中,网络通信是构建分布式系统的关键技术之一。本话题将探讨如何使用C++客户端与Java(通过Netty框架)服务器端实现TCP通讯,并涉及数据序列化工具Protocol Buffers(protobuf)在两者之间的交互。 首先,...

    netty实现sdtp协议

    4. **安全性**:为了保护设备和服务器的数据安全,SDTP 可能需要集成加密和身份验证机制。 接下来,我们来看看如何在 Netty 中实现 SDTP 协议: 1. **定义消息格式**:首先,我们需要定义 SDTP 消息的结构,包括头...

    Netty实现Java服务端和C#客户端联通

    同时,为了保证网络通信的健壮性,还需要处理各种异常情况,如连接断开、数据丢失等。 在实现过程中,可能会遇到的问题包括网络延迟、数据同步问题、线程安全等。因此,对并发编程和网络编程有深入理解是非常重要的...

    netty拆包粘包解决方案示例

    在分布式系统和网络通信中,Netty是一个非常流行的高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨Netty中解决拆包粘包问题的策略,以及客户端断线重连的...

    java应用netty服务端和客户端

    Netty广泛应用于分布式系统、云计算、大数据处理等领域,它的核心特性包括非阻塞I/O、高效的缓冲区管理以及丰富的协议支持。 在"java应用netty服务端和客户端"的示例中,Netty被用来构建一个简单的通信系统,其中...

    java服务器端(Netty_Proto)和c++客户端tcp通讯.rar

    这个项目涉及到的技术栈广泛,从服务器端的Java编程到客户端的C++编程,再到网络通信协议,都需要深入理解和实践。开发者需要具备扎实的网络基础知识、熟悉Java和C++编程,以及对ProtoBuf和Netty的运用能力。

    java实现基于netty 的udp字节数据接收服务

    在Java编程环境中,Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建可伸缩、高并发的服务器。本示例关注的是如何利用Netty实现一个基于UDP(User Datagram Protocol)的数据接收服务,这在需要进行...

    JAVA netty完整示例代码

    JAVA netty完整示例代码。里面包括整个项目和所需的JAR包。示例以:TCP/IP自定义报文协议...备注:netty是JAVA高性能TCP/IP网络编程,有很多数据存储工具:ELASTICSEARCH和HBASE都是用基于NETTY编程,值得研究学习。

    java netty通信

    Java Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Java世界中,Netty由于其高效、灵活和强大的特性,已经成为网络编程的事实标准。本主题将深入探讨Netty...

    基于Java的netty-mqtt MQTT 3.1.1协议服务端与客户端设计源码

    netty-mqtt是一个基于Java开发的MQTT 3.1.1协议服务端与客户端,包含113个文件,其中包括87个Java源文件、8个XML文件、7个Iml文件、3个YAML文件、3个JKS文件、2个Factories文件、1个LICENSE文件和1个Markdown文件。...

Global site tag (gtag.js) - Google Analytics