Java高手速成 | 使用TCP进行手机文件传输
2023-09-11 14:20:23 时间
由于TCP是面向流的,这意味着接收端有可能会在一次接收动作中接收两个或者多个数据包,那么当发送方需要把一个大文件分批连续发送时,如何保证接收方能够正确地接收并重修组会成一个完整的文件显得十分重要,本节通过一个端到端的手机文件传输程序,详细阐述了如何使用多线程进行任意大小文件的TCP分批发送和接收。
TCP是面向流的。面向流是指无保护消息边界的,如果发送端连续发送数据,接收端有可能会在一次接收动作中接收两个或者更多的数据包。
举个例子来说,如果发送端连续发送三个数据包,大小分别是1KB、2KB、4KB,这三个数据包都已经到达接收端缓冲区中,如果使用UDP协议,无论接收缓冲区多大,都必须有三次接收动作才能把所有数据包接收完。而使用TCP协议,只要把接收缓冲区大小设置为7KB以上,就能够一次将所有数据包接收下来,即只需进行一次接收动作。
这是由于TCP协议把数据当作一串数据流,所以并不知道消息的边界,即独立的消息之间是如何分隔开的。这便会造成消息的混乱,也就是说不能保证一个Send方法发出的数据被一个Receive方法读取。例如,客户端发送的消息是:第一次发送abcde,第二次发送12345,服务器方接收的可能是abcde12345,即一次性接收完;也可能是第一次接收abc,第二次接收de123,第三次接收45。
针对这个问题,一般有3种解决方案:①发送和接收定长的消息;②把消息的尺
相关文章
- 深入java面向对象五:Java的内存管理
- Java I/O学习(附实例和详解)
- java错误:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Bu
- Java实现 LeetCode 778 水位上升的泳池中游泳(二分+DFS)
- Java实现 LeetCode 543 二叉树的直径
- java实现古堡算式
- java实现第五届蓝桥杯猜年龄
- Java实现第八届蓝桥杯购物单
- Java实现字符串转换成整数
- ThreadLocal,Java中特殊的线程绑定机制
- Java中的多线程你只要看这一篇就够了
- Eclipse 报 “Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ”错误的解决办法
- Java BIO、NIO、AIO-------转载
- java 11 标准Java异步HTTP客户端
- 【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容
- atitit.研发管理--标准化流程总结---java开发环境与项目部署环境的搭建工具包总结
- Java String Format 使用实例
- java 程序运行的基础知识【Java bytecode】
- Java并发编程:深入剖析ThreadLocal
- Java 异常解决之java.lang.IllegalArgumentException: Comparison method violates its general contract!
- JAVA语言之Java 中不同的并行实现的性能比较
- DNS同时占用UDP和TCP端口53——传输数据超过512时候用tcp,DNS服务器可以配置仅支持UDP查询包
- Java工程师学习路线图,从初级到高阶你需要掌握这些
- 【java】Java 内存模型
- Mybatis源码分析之(五)mapper如何将数据库数据转换成java对象的
- JAVA开发讲义(二)-Java程序设计之数据之谜三
- java的访问权限