网络编程 基于TCP的多文件传输程序(二)

来源:互联网 发布:韩语打字软件下载 编辑:程序博客网 时间:2024/05/16 11:19

新人,Java学习中,文章中遗漏错误之处,欢迎斧正
个人博客,完全原创
转载请注明出处。
项目全代码地址:GitHub
前一期文章:网络编程 基于Socket的多文件传输程序实现(一)

[3]丰富类与方法的细节

[3.1]工具类

工具类中除了存放之前的说明的findFile()方法之外,还可以将Client类与Server类都需要的XML文件相关读取方法封装在一起存放于此.
public static Map<String,String> readerXml(String filePath)
使用dom4j包中的相关API配合jaxen包的xpath读取XML文件,并将需要的数据以键值对的形式存入Map集合返回.

xmlReader

[3.2]Client类

对于客户端类而言,之前在它们的连接和数据传输中分析了Socket对象的创建和基本的IO流操作流程.
现在已经可以从文件中读出需要的配置属性,因此在构造方法中我们可以在init()方法中抛弃固定值不变的HOST和PORT,由静态方法readerXml()方法从配置文件中读取的Map集合中获取.
client_init

在文件的读写和数据传输阶段,将所有的步骤封装进一条线程之中
只有当服务器传回”Get File Name”代表着服务器已经做好了读取文件数据的准备,开始进行当前文件传输.在
这之前,程序不允许对文件进行任何读取和传输.以免对客户端造成数据污染.同理,在当前文件传输完毕后,需要接收到服务器端传输的”File Copy OK”的信号,否则不进行下一份文件的传输读写,防止两端读写文件不一致,导致copy失败.
client_start

在进行文件读写的过程中,为了突出客户端与服务端的文件读写顺序的控制逻辑,将文件实际读写与传输数据的行为进行封装.
writeFile

[3.3]Server类

与客户端类相同,在完成了配置属性的文件流读写后,我们可以在客户端对象的生成中抛弃固定的属性,使用可以根据实际需要在配置文件中进行更改的可变属性.
server_init

在与客户端的连接控制传输的逻辑中,服务端启动传输并返回”Get File Name”信号给客户端示意可以开始文件传输的前提是正确的接收到客户端发送的文件名(fileName)并以此创建了对应的文件副本和待传输文件长度(length)之后. 为了客户端的运行逻辑的正确性,即使服务端接收了错误的信息,也需要向客户端反馈提示客户端传输”Error”错误信息. 防止客户端在传出信息后无法接收到有效的反馈信息.
getName

服务端的需要正确的读取客户端发送的数据,并将它们写入到准备好的存于服务端的对应文件中,数据的正确性和完整性有TCP传输协议的保证.
我们需要做的是控制服务端文件接收的判断逻辑.
在正确的接收文件信息并创建了对应的copy文件后,客户端的待传输文件开始了文件数据读取和传输.
客户端判断当前文件传输完毕后会进行一个while语句等待服务器端传输正确读写完毕的信号,才进行下一份文件传输.
而在服务器端的输入流不是传统的文件输入流,我们无法正确的根据输入的值判断当前文件是否读写完毕.
此时需要借助之前的文件长度length进行辅助判断当前文件是否写入完毕.每次文件写入一组字节时,将字节长度存入一个变量中,判断存储总计写入长度的变量与文件原始长度变量值进行比较,判断当前文件是否写入完毕.
当当前文件写入完毕后,跳出写入循环向客户端发送一则写入完毕的信息”File Copy OK”,提示服务器端当前文件已经读写完毕,可以进行下一份文件的读写.
writeFile

[4]写在最后

至此一个简单的控制台版的多文件传输系统就基本完毕了,确实是很简陋.有方法的封装选择不正确,而有些方法又过于臃肿,文章中的类与方法的分类与程序中有些许的出入,这是由于书写总结也是一个反思优化的过程,有些部分是之前编写时没有考虑完善或是不尽如人意的,在写博客时,下意识进行了一定程度上的优化和改善.

程序本身除了需要进行结构优化和改善外,功能其实也可以进行进一步的开发.比如:
1. 在配置文件中添加读写文件夹的地址信息,用户可以在外部手动更改希望传输的文件夹和存储的文件夹.
2. 为客户端和服务器端添加可视化操作界面,进一步的简化操作,无需在IDE运行,无需在配置文件更改配置
等等…

0 0
原创粉丝点击