如何实现多线程文件传输,那位高手能给个例子我看看!一个服务器,多个客户端。多个客户端连同一服务器,如何使用多线程?

解决方案 »

  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 Test{    String line;
        String name;
        long fileSize;
        ServerSocket ssFile = null;
        ServerSocket ssMessage = null;
        Socket server = null;
        Socket serverMessage = null;
        
        int n = 0; Test()
    {
        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
                Test test = new Test();
                test.getFile();            
        }
    }
    class ReceiveFile extends Thread
    {
    Socket server = null;
    Socket serverMessage = null;
    String line;
        String name;
        long fileSize;
        String filePath;
        int s,e;
        boolean state;
        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)=='|')
              {
              state = true;
              }
             }
             if(state)
             {
              for(int i = 0;i<line.length();i++)
             {
              if(line.charAt(i)=='?')
              {
              name = line.substring(0,i);
              s = i+1;
              }
              if(line.charAt(i)=='|')
              {
              filePath = line.substring(i+1);
                    e = i;
              }
             }
           
             fileSize = Long.parseLong(line.substring(s,e));
            
             //System.out.println(name);
            File file = new File("c:\\temp\\"+filePath+File.separator);
            file.mkdirs();         
            System.out.println(file.getAbsolutePath()+File.separator+name);
            File filename = new File(file.getAbsolutePath()+File.separator+name);
            if(filename.exists())
            {
             filename.delete();
             System.out.println("文件已经存在!");
            }
            
            filename.createNewFile();
            RandomAccessFile raf = new RandomAccessFile(filename,"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(filename.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:\\temp\\");
             }
             else
             {
             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();
     }
    }
    }