客户端程序:
import java.io.*;
import java.net.*;
public class SendFile { Socket clientMessage = null;
    DataOutputStream os = null;
    Socket clientFile=null;
    OutputStream netOut = null;
    OutputStream doc = null;
    DataOutputStream fileos = null;
/**
 * @param args
 */
    SendFile()
    {
    
     //clientFile = new Socket("192.168.1.101",5151);
//clientMessage = new Socket("192.168.1.101", 5150);
//java.util.Timer timer=new java.util.Timer();
//timer.schedule(new MyTask(),0,5000);
    }

public void sendDirectory(String filepath)
{
try
{
File file = new File(filepath);
            File[] fs = file.listFiles();
            for (int i = 0; i < fs.length; i++) 
            {
                if (fs[i].isDirectory())
                 sendDirectory(fs[i].getAbsolutePath());
                else
                 {
                     System.out.print("文件:");
                     System.out.println(fs[i].getName());
                     sendMessage(fs[i].getName()+"?"+String.valueOf(fs[i].length()));
                     FileInputStream fos = new FileInputStream(fs[i]);  
                     clientFile = new Socket("192.168.1.103",5151);
                     netOut = clientFile.getOutputStream();
                     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);
                         System.out.print(num);
                     }
                     fos.close();
                     doc.close();
                 }
            }
}
catch(Exception e)
{
e.printStackTrace();
}
}

public void sendMessage(String name)
    {
        try
        {
            clientMessage = new Socket("192.168.1.103", 5150);
            os = new DataOutputStream(clientMessage.getOutputStream());
            System.out.println(name.trim());
            os.writeUTF(name.trim());
            os.flush();
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }    }
public static void main(String[] args) {
// TODO Auto-generated method stub
SendFile sendfile = new SendFile();
sendfile.sendDirectory("d:\\JavaApp");
}}

解决方案 »

  1.   

    服务器端程序:
    import java.io.BufferedInputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.RandomAccessFile;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;public class TestServer{    String line;
        String name;
        long fileSize;
        ServerSocket ssFile = null;
        ServerSocket ssMessage = null;
        Socket server = null;
        Socket serverMessage = null;
        
        int n = 0;    TestServer()
    {
        try 
        {
            ssMessage = new ServerSocket(5150);
            ssFile = new ServerSocket(5151);
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public void getFile()
    {

        try
        {   
         System.out.println("\nSocket监听服务已经启动。");
            System.out.println("正在等待客户端程序的请求 ...\n");
            while(true)
            {
             server = ssFile.accept();
            serverMessage = ssMessage.accept();
            
            System.out.println(server.getInetAddress()+"连接");
                ReceiveFile receiveFile = new ReceiveFile(server,serverMessage);
                receiveFile.start();
                System.out.println(receiveFile.getState());
            }
            
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
         TestServer test = new TestServer();
            test.getFile();            
        }
    }
    class ReceiveFile extends Thread
    {
    Socket server = null;
    Socket serverMessage = null;
    String line;
        String name;
        long fileSize;
        
        ReceiveFile(Socket server,Socket serverMessage)
        {
         try
         {
         this.server = server;
         this.serverMessage = serverMessage;
         }
         catch(Exception ex)
         {
         ex.printStackTrace();
         }
        }
    public void run()
    {
     try
     {
     System.out.println(Thread.currentThread());
     DataInputStream is = new DataInputStream(serverMessage.getInputStream());
             DataOutputStream os = new DataOutputStream(serverMessage.getOutputStream());
             line = is.readUTF();
             for(int i = 0;i<line.length();i++)
             {
              if(line.charAt(i)=='?')
              {
              name = line.substring(0,i);
              fileSize = Long.parseLong(line.substring(i+1));
              }
             }
             //System.out.println(name);
            File file = new File("c:\\temp\\"+name);
            if(file.exists())
            {
             file.delete();
             System.out.println("文件已经存在!");
            }
            
            file.createNewFile();
            RandomAccessFile raf = new RandomAccessFile(file,"rw"); 
            if(server.isClosed())
             System.out.println("server close!");
            InputStream netln = server.getInputStream();
            InputStream in = new DataInputStream(new BufferedInputStream(netln));  
            byte[] buf = new byte[2048];
            int num = in.read(buf);
                            System.out.println("开始接收...");
            while(num!=(-1))
            {
                raf.write(buf,0,num);
                raf.skipBytes(num);
                num=in.read(buf);
            }
            if(file.length()==fileSize)
            {
                  os.writeUTF("S");
              os.flush();
            }
            else
            {
              os.writeUTF("F");
              os.flush();
            }
            in.close();
            raf.close();
            //System.out.println(line + "大小" + fileSize + "已保存到C:\\");
            System.out.println(server.getInetAddress()+"文件名:"+name+" 大小:"+fileSize+" 已保存到C:\\");
     }
     catch(Exception ex)
     {
        ex.printStackTrace();
     }
    }
    }
      

  2.   

    客户端指定一个目录(目录下还有子目录和文件)发送给服务端接收,现在的程序只可以实现,把指定目录下的所有文件(包括子目录底下的文件)发送给服务器端,我想按照目录的结构的来发,
    例如
    我指定:d:\JavaApp这个文件夹(JavaApp底下还有chat,server等文件夹当然这吓文件夹底下应该有文件)服务器端接收应该和客户端的文件夹结构一样,会有个JavaApp文件夹(JavaApp底下还有chat,server等文件夹当然这吓文件夹底下应该有文件)不知道怎么实现?
      

  3.   

    可以把文件打包成zip啊,然后在客户端再解压出来!