zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java高手速成 | 使用TCP进行手机文件传输

JAVATCP手机 进行 高手 文件传输 速成 使用
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种解决方案:①发送和接收定长的消息;②把消息的尺