通信讲的就是根据协议传送数据。传送文件的套路也是差不多的,我们做的也是小文件的传送。可能具体的做法还是各有不同,我们是用最笨的方法做的,客户端首先使用文件输入流将文件读出来,将读到的字符串转换成byte 数组,再写进网络输出流中。后面就是服务器的事了,流程基本上反过来就差不多了。不过我们再做的过程中,还是纠结了很久,很多小问题都困扰着我们。特别是我这边的客户端,我犯了几个很揪心的错误。
1.首先最不能原谅自己的就是现在居然又犯这个错,e.getSource() 和e.getActionCommand()返回的结果类型又搞错了。以后坚决要记住了。
2.将byte数组转换成string 类型。很遗憾,我想当然的使用了toString()方法,结果打印测试的时候,一直是乱码,想不通,为什么前面打印它的长度是对的,这里就卡掉了。我和搭档试了很多遍结果还是一样。于是去查API文档,发现方法用错了。上面那个方法是将单个byte值转换string时用的.。string(byte[] bytes)的这个构造方法才是我们需要的。然后就迫不及待的用了这个方法。
3.File file=new File("D:\\100"+name); //文件保存的地址
我们将收到的文件的内容都打印出来了,可是去上面这个目录上查看的时候还是没有。真的想不通啊,怎么可能呢!不可能的啊,我们都可以将其内容读出来了,怎么还是没有???
坐在那发了下呆,才无意中看到这个路径,是不是少了点什么,赶紧加上。
File file=new File("D:\\100\\"+name); //文件保存的地址
才终于解决啊。
以上读取文件时是一次从头到尾,再写进网络流中,没有考虑到大文件传送时会遇到的问题。所以针对大型文件显然这不是个好方法了。
一般发送方可以采用多线程的并行方法来读取和传送,这样会更快些。首先自己可以定义根据文件的大小来分区,固定每一小块的文件的大小(当然最后一块可以不同),当然多线程传送的时候也要标记每一小块的顺序,以便后来文件的还原。接收方在接收文件数据时,根据每个线程记录的顺序标记,和协议规定的每一快文件的大小来确定接收到的文件的插入位置,再整合到原来的文件,完成大文件的传送。不过大型文件我们暂时还没有实现,打算在这次的项目中实现。