一个通过Socket实现的文件传输。
  发送端大概的实现是:
       try
       {
           out.writeUTF("??Receive File??");  //通知接收端现在要接收文件
       }
       catch(Exception e)
       {
       }
       try
       {
           out.writeUTF(f.getFile());   // f.getFile()是一个文件的字符串
          FileInputStream fos = new FileInputStream(F); //F是File类型的,联接f
         OutputStream netOut = socket.getOutputStream();
           OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));
           //创建文件读取缓冲区
           byte[] buf = new byte[2048];
           int num = fos.read(buf);
           while(num != -1){ //是否读完文件
               doc.write(buf, 0, num); // 把文件数据写出网络缓冲区
               doc.flush();  // 刷新缓冲区把数据写往客户端
               num = fos.read(buf);  // 继续从文件中读取数据
           }
           fos.close();
           doc.close();
       }
       catch(Exception e)
       {
           JOptionPane.showMessageDialog(null, "文件读取或发送错误" , "注意", JOptionPane.ERROR_MESSAGE);
       }
   接收端大概是:
   while(true)
   {
        try{
filename = in.readUTF();  // 此处接收上面那个"??Receive File??"
}
catch(Exception e){
System.out.println(filename);
System.out.println(e);
break;
}

if(filename.compareTo("??Receive File??") == 0)
{
try
{
filename = in.readUTF();
System.out.println(filename);
}
catch(Exception e){
System.out.println(e);
}
receiveFile(filename, disk);
}
}
       
       
   public static void receiveFile(String filename, String filedirectory)
   {
   File file=new File(filedirectory + filename);
   try
   {
  
file.createNewFile();
RandomAccessFile raf = new RandomAccessFile(file,"rw");
InputStream netIn = you.getInputStream();
InputStream In = new DataInputStream(new BufferedInputStream(netIn));
//创建缓冲区缓冲网络数据
byte[] buf=new byte[2048];
int num=In.read(buf);
while(num!=(-1)){ //是否读完所有数据
raf.write(buf,0,num);//将数据写往文件
raf.skipBytes(num); //顺序写文件字节
num=In.read(buf); // 继续从网络中读取文件
}
In.close();
raf.close();
   }
   catch(Exception e){
   System.out.println(e);
   }
   System.out.println(filename + "接收完毕");
}
}这个程序可以接收一次文件,但循环到第二次的时候,在
  try{
filename = in.readUTF();  // 此处接收上面那个"??Receive File??"
}
以下这个位置就会出错。抛出一个EOFException异常。可以告诉我怎么解决吗?

解决方案 »

  1.   

       真的很不好意思,我没有把情况说明得很清楚。
    我的意思就是说,当我读取完文件以后,如果再用
    in.readUTF();就会抛出EOFException的异常,不知道为什么。 希望有回帖,不然就太郁闷了!
       楼上的好心人,谢谢你,不过我说得很清楚了,
    try{ 
    filename = in.readUTF();  // 此处接收上面那个"??Receive File??" 
    } 这个位置会出错,出错的提示信息是EOFException
      

  2.   

    while(num != -1){ //是否读完文件 因为读完一个文件,你的fos就关掉了   fos.close(); 
      

  3.   

    EOFException与其说是一个异常,不如说它是一个标识结束的正常标志,你需要多次读文件就一定要在逻辑上控制你对流的读和写,而并不是简单的去流里面读到没有为止,如果你希望读到没有为止,那么最后一个标志就一定会是EOF,也一定会抛出EOFException随之流被关闭。简单来说,你一定要控制你读的byte数,不能让读到流最后那个EOF,因为一读到这流就认为不会再有数据结束而马上关闭。
    最常见的做法是每次先发送File的length过去,对方读到length,再发File的话接收端就能严格知道应该读多少length的byte,一直不会多读也就不会碰触到EOF