`
moor212
  • 浏览: 176130 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中的分包处理 

 
阅读更多
java中的分包处理 

一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系。接收端接收到正确的后都要给发送端一个应答。不给应答的算超时,发送端将重发。 出现粘包和半包现象,是因为TCP当中,只有流的概念,没有包的概念.。
可以使用UDP协议.这样可以就可以区分每个包了.但是要确保包的丢失处理.为了提到效率,可以考虑写一个滑动窗口进行收发包.
若采用TCP协议进行传输,就要将每个包区分开来.可以有三种方式.因为TCP是面向流的.流只有打开和关闭,你要用一个流传输多个包,那就要向办法区分出每个包.

1.可以每次发送同样大小的包,过大的包不予发送,过小的包,后面部分用固定的字符'/0'进行填充。

2. 将流按字符处理,抽出一个字符做转义字符(通常Java用'/'来做转义字符,比如"/n"表示换行).假如就设'/'为转义字符,发送方如果流当中出现'/',就在后面在追加一个'/',如果包结束,则用'/'做包的结束符.这样,在接收方,若读取一个单独的'/'或者流结束,就标示前面的内容构成一个包,如果连续读取两个'/',就将两个'/'用一个'/'进行替换.这样,就可以保证原来包中的信息不变,同时也能区分出每个包了。

3.在发送方发送一个包的时候,先将这个包的长度发送给对方(一般是4个字节表示包长),然后再将包的内容发送过去.接收方先接收4个字节,看看包的长度,然后按照长度来接收包,最好是大端字节序。

以上三种方法,是网络传输中经常用到的方法.后两种很常见.最后一种,在TCP长连接传输中应用最多.
综合以上的说法,就是要在TCP协议以上再封装一层协议,用来做分包的信息交换.
当然,如果TCP不是非要长连接,或者,信息包不是批量传输的情况下.可以一次TCP连接只传输一个包.这种情况下一般,一次TCP完成一次交互,即发送方发送信息包,接收方接收信息包同时发送一个接收方的响应包给发送方,表明接收方收到信息包,还是收到了错误包,或者接收方系统异常没有处理这个包之类的信息. 其实HTTP的交互过程,就是这样的.



读取数据使用DataInputStream和DataOutputStream,不要用BufferedReader和PrintStream。使用字节传送方式,使用readFully,
readFully
public final void readFully(byte[] b)
                     throws IOException参见 DataInput 的 readFully 方法的常规协定。
从所包含的输入流中读取此操作需要的字节。


指定者:
接口 DataInput 中的 readFully
参数:
b - 存储读取数据的缓冲区。
抛出:
EOFException - 如果此输入流在读取所有字节之前到达末尾。
IOException - 如果发生 I/O 错误。
另请参见:
FilterInputStream.in

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

readFully
public final void readFully(byte[] b,
                            int off,
                            int len)
                     throws IOException参见 DataInput 的 readFully 方法的常规协定。
从所包含的输入流中读取此操作需要的字节。


指定者:
接口 DataInput 中的 readFully
参数:
b - 存储读取数据的缓冲区。
off - 数据的起始偏移量。
len - 要读取的字节数。
抛出:
EOFException - 如果此输入流在读取所有字节之前到达末尾。
IOException - 如果发生 I/O 错误。
另请参见:
FilterInputStream.in


Java code

in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
out = new DataOutputStream(socket.getOutputStream());




分享到:
评论

相关推荐

    netty-server中采用的分包拆包源码,java开发用于实战项目

    @Component public class RabbitmqConfig { private final static String message = "web.socket.message";...完整代码,下载有详细说明,使用于长报文通讯,将报文长度截取一定字节发送,便于网速传输中丢包

    AnySubPackage APK分包工具

    3. **多版本支持**:由于用户可能处于不同的系统版本环境中,分包工具需要处理不同Android版本间的兼容性问题,确保所有子模块在各种设备上都能正常工作。 4. **签名一致性**:所有子模块APK必须与主APK使用相同的...

    文件通过SOCKET分包传输

    在Java中,`java.io.File`类代表操作系统中的文件,而`java.io.FileInputStream`和`java.io.FileOutputStream`则用于读写文件。在分包传输过程中,我们需要用到文件流来读取文件内容,并将其转换为可发送的数据块。 ...

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

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

    北大青鸟java1单元分包项目

    通过“北大青鸟java1单元分包项目”,学员不仅能得到实战经验,还能为后续更高级的Java开发技术打下坚实基础,如多线程、并发处理、分布式系统等。这个项目旨在提升学员的实际问题解决能力,培养他们的编程思维,使...

    java使用udp协议和硬件进行数据收发处理

    上述代码展示了基本的UDP数据收发流程,但实际应用中可能需要考虑更多的因素,如多线程处理接收,错误处理,数据的分包与重组等。为了提高程序的可读性和复用性,通常会将发送和接收功能封装到单独的类或方法中,并...

    有关Java分层的思想

    5. 分包策略:在实际开发中,为了保持代码的整洁,我们会根据功能将类分到不同的包中。例如,业务逻辑层的实体类可以放在`entity`包下,服务接口和实现放在`service`包,DAO(数据访问对象)放在`dao`包,这样便于...

    java面试题 web corejava

    - `doGet`和`doPost`方法的区别:`doGet`用于处理GET请求,`doPost`处理POST请求,POST请求能传输更多数据且不显示在URL中。 2. **JSP(JavaServer Pages)**: - JSP是动态网页技术,允许在HTML中嵌入Java代码,...

    java处理HJ212数据采集解析数据处理入库

    1.hj212 2015、2017皆可以测试 2.本项目测试都可以使用,主要数据存储为mongdb...4.数据异常,数据超标做了一些处理 本文参考博客使用更加方便!https://blog.csdn.net/weixin_44106334/article/details/110219786

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

    这个项目可能包含了使用`LineBasedFrameDecoder`和`DelimiterBasedFrameDecoder`的服务器端和客户端实现,通过这些文件,开发者可以学习如何在实际项目中应用Netty来处理粘包和分包问题。 总之,理解和正确使用...

    Jbpm源代码分包详解

    `org.jbpm.pvm.internal.jms`包涉及JMS(Java Message Service)消息处理,`JmsMessageSession`与`Message`类一起用于异步消息传递。 `org.jbpm.pvm.internal.job`包包含了作业、消息和定时器的实现,它们是流程中...

    用bsdiff的bsdiff/bspatch命令生成差分包和合并差分包

    它通过比较两个文件的原始版本(旧版)和新版本(新版),找出它们之间的差异,并将这些差异以压缩的形式存储在一个单独的文件中,这个文件就是我们所说的差分包。bsdiff的工作原理基于Burrows-Wheeler变换和MD5哈希...

    java解析hj212.rar

    Java解析HJ212协议是一项在环保领域中常见的任务,因为HJ212是中国环境保护部制定的一套数据交换标准,主要用于环境监测数据的传输和处理。这个名为"java解析hj212.rar"的压缩包包含了针对HJ212协议的Java实现,覆盖...

    Xmodem和Ymodem 传输协议JAVA实现

    本文将深入探讨这两种协议的工作原理,并提供它们在Java环境中的实现。 **Xmodem协议** Xmodem是最简单的文件传输协议之一,每一步传输128字节的数据块。它通过校验和机制来检测数据传输中的错误。Xmodem协议分为两...

    JBPM4 java源代码分包详解JBPM4

    【JBPM4 Java源代码分包详解】 JBPM4是一个流行的开源工作流管理系统,它提供了一整套用于设计、执行和管理业务流程的工具。在深入研究JBPM4的源代码时,我们可以从其包结构中了解到框架的核心功能和设计理念。 1....

    UDP_MFC_Demo_消息分包组包

    在这个"UDP_MFC_Demo_消息分包组包"项目中,我们关注的重点是如何在使用MFC进行UDP通信时处理消息的分包和组包问题。在传输大块数据时,由于UDP报文的大小限制(通常为65535字节),我们可能需要将一个大的消息拆分...

    对反编译后的smali文件进行分包

    在本文中,我们将深入探讨如何通过Java实现对反编译后的smali文件进行分包,以便处理方法数过多的问题。 首先,我们需要理解smali语言。Smali是一种汇编级别的语言,它是Dalvik虚拟机字节码的逆向工程表示,用于...

    JAVA_MPEG.zip_MPEG_MPEG Stream java_java mp

    在Java中处理MPEG流,需要理解其文件结构,如MPEG的TS(Transport Stream)和PS(Program Stream)格式,以及它们的分包、同步字节和复用规则。 3. **解码器**:播放MPEG文件,必须将编码后的数据解码成原始的音频...

    JAVA下载工具源代码

    在Java中,可以使用并发API,如ExecutorService和Future,或者使用Swing的Worker线程来处理这种并发下载。 在"MiniThrunder"这个压缩包中,我们可以期待找到以下组件和实现: 1. 主界面:使用Swing组件如JFrame、...

    基于java的中国移动短信协议CMPP封装 hicmpp.zip

    在Java中,可以使用ByteBuffer或自定义的序列化方法来处理。 3. **消息分包与重组**:由于TCP不保证数据包的顺序到达,CMPP协议允许消息被分包发送,并在接收端进行重组。Java开发者需要理解并实现这一机制,确保...

Global site tag (gtag.js) - Google Analytics