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!