Como pegar um arquivo do servidor (cliente-servidor)

Ola pessoal, gostaria que alguem me desse uma mão, eu tenho o codigo de um cliente servidor. o servidor espera o cliente entrar e lista o resultado da busca do cliente. o cliente pode fazer busca no servidor e se achar o arquivo de seu interesse baixa-lo. Eis o codigo:

servidor.java

 import java.io.*;
 import java.net.*;
 import java.util.*;
 
 public class servidor extends Thread {
     
     public static void main(String args[])
     {
         clientes = new Vector();
        
         try
         {
             ServerSocket s = new ServerSocket(2222);
 
             System.out.println("Esperando alguém fazer busca...");
             Socket conexao = s.accept();
             // Pegar a string enviada
 
             Thread t = new servidor(conexao);
             t.start();
         }
         catch (IOException e)
         {
             // caso ocorra alguma excessão de E/S, mostre qual foi.
             System.out.println("IOException: " + e);
         }
     }
     
     private static Vector clientes;
     
     private Socket conexao;
     
     private String meuNome;
 
     public servidor(Socket s)
     {
         conexao = s;
     }
     
     public void run()
     {
         try
         {
             BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
             PrintStream saida = new PrintStream(conexao.getOutputStream());
 			
 			// Testando
 			File f = new File(".");
 			File dir = new File(f.getAbsolutePath());
 			String[] children = dir.list();
 			if (children == null) 
 				{
 				// Either dir does not exist or is not a directory
 				} 
 			else 
 				{
 				for (int i=0; i<children.length; i++) 
 					{
 					// Get filename of file or directory
 					String filename = children[i];
 					System.out.println(filename);
 					}
 				}
 			
 			// It is also possible to filter the list of returned files.
 			// This example does not return any files that start with `.'.
 			FilenameFilter filter = new FilenameFilter() 
 				{
 				public boolean accept(File dir, String name) 
 					{
 					return !name.startsWith(".");
 					}
 				};
 			
 			children = dir.list(filter);
 			// The list of files can also be retrieved as File objects
 			File[] files = dir.listFiles();
 			// This filter only returns directories
 			FileFilter fileFilter = new FileFilter() 
 				{
 				public boolean accept(File file) 
 					{
 					return file.isDirectory();
 					}
 				};
 			
 			files = dir.listFiles(fileFilter);
 			//
 
             // primeiramente, espera-se pelo nome do cliente
             meuNome = entrada.readLine();
 
             // agora, verifica se string recebida é valida, pois
             // sem a conexão foi interrompida, a string é null.
             // Se isso ocorrer, deve-se terminar a execução.
             if (meuNome == null)
             {
                 return;
             }
 
 
             // Uma vez que se tem um cliente conectado e conhecido,
             // coloca-se fluxo de saída para esse cliente no vetor de
             // clientes conectados.
             clientes.add(saida);
 
             // clientes é objeto compartilhado por várias threads!
             // De acordo com o manual da API, os métodos são
             // sincronizados. Portanto, não há problemas de acessos
             // simultâneos.
             // Loop principal: esperando por alguma string do cliente.
             // Quando recebe, envia a todos os conectados até que o
             // cliente envie linha em branco.
             // Verificar se linha é null (conexão interrompida)
             // Se não for nula, pode-se compará-la com métodos string
             String linha = entrada.readLine();
 
             while (linha != null && !(linha.trim().equals("")))
             {
 
                 // reenvia a linha para todos os clientes conectados
                 sendToAll(saida, " disse: ", linha);
 
                 // espera por uma nova linha.
                 linha = entrada.readLine();
             }
 
             // Uma vez que o cliente enviou linha em branco, retira-se
             // fluxo de saída do vetor de clientes e fecha-se conexão.
             sendToAll(saida, " saiu ", "do chat!");
 
             clientes.remove(saida);
             conexao.close();
         }
         catch (IOException e)
         {
             // Caso ocorra alguma excessão de E/S, mostre qual foi.
             System.out.println("IOException: " + e);
         }
     }//final do void run
 
 
     // enviar uma mensagem para todos, menos para o próprio
     public void sendToAll(PrintStream saida, String acao, String linha) throws IOException
     {
 
         Enumeration e = clientes.elements();
 
         while (e.hasMoreElements())
         {
 
             // obtém o fluxo de saída de um dos clientes
             PrintStream chat = (PrintStream) e.nextElement();
 
             // envia para todos, menos para o próprio usuário
             if (chat != saida)
             {
                 chat.println(meuNome + acao + linha);
             }
         }
     }
 
 }
 

busca1.java (cliente)

 import java.io.*;
 import java.net.*;
 
 public class cliente {
     
     private static boolean done = false;
     
     public static void main(String args[])
     {
         try {
             Socket conexao = new Socket("200.203.56.133", 2222);
 
             PrintStream saida = new PrintStream(conexao.getOutputStream());
 
             BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
             System.out.print("Busca: ");
             String busca = teclado.readLine();
             saida.println(busca);
         }
         catch (IOException e) {
             // Caso ocorra alguma excessão de E/S, mostre qual foi.
             System.out.println("IOException: " + e);
         }
     }
 }
 

alguem pode me ajudar com isso? só tá faltando baixar o arquivo…
Obrigado!