1- Escriba un programa que quede esperando requerimientos de 
clientes que se contactan con l por el port 7777. Cuando un 
Cliente se contacta, manda primero el nombre de un archivo y 
luego un patrn de texto  a buscar en el archivo. El programa
responde con el nmero de lneas en el cual ese patrn de texto 
apareca en el archivo.
    
   ServerSocket ssocket = new ServerSocket(7777);
   while(true) {
      Socket s = ssocket.accept();
      BufferedReader in = new BufferedReader(new 
                            InputStreamReader( s.getInputStream());
      PrintWriter out = new PrintWriter(s.getOutputStream(), true);
      String archivo = in.readLine();
      String patron = in.readLine(); 
      BufferedReader inArch = new BufferedReader(new
                                      FileReader(archivo));
      int i = 0;
      String linea;
      while( (linea = inArch.readLine()) != null)
           if (linea.indexOf(patron) != -1) ++i;
      out.println(i);
      s.close();
    } 

 qu pasa si el archivo no existe ?
modifique esto con try & catch para que devuela 0 si el 
archivo no apareca


2- En un archivo llamado "computadores" viene en la primer 
lnea un texto cualquiera y las restantes lneas contienen
cada una, una direccion de computador. Escriba un programa 
que contacte a cada uno de los computadores que vienen desde 
la segunda lnea hasta la ltima del archivo y que suponiendo 
que el programa anterior corre en cada uno de los computadores 
cuyo nombre viene en el archivo, obtenga las veces que el  texto 
de la primera lnea del archivo "computadores" aparece en el 
archivo "nombres" ubicado en cada uno de los computadores remotos. 
El programa debe imprimir el nombre del computador donde est 
ubicado el archivo  nombres que contiene el nmero mximo de 
apariciones del texto. Puede suponer que hay a lo ms 100 computadores 
a los cuales preguntarles

    String nombreCompMax = null;
    int maxVeces = 0; 
    BufferedReader inArch = new BufferedReader(new 
                                      FileReader("computadores"));
    String patron = inArch.readLine();
    String nombreComp = null; 
     while( (nombreComp = inArch.readLine()) != null) {
        Socket s = new Socket(nombreComp,7777);
        BufferedReader in = new BufferedReader(new 
                    InputStreamReader( s.getInputStream());
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);
        out.println("nombres");
        out.println(patron);
        int i = Integer.parseInt(in.readLine());
        if (i > maxVal) {
              maxVal = i;
              nombreCompMax = nombreComp;
        }
     }
     ystem.out.println("El comp es "+nombreCompMax +
                        " el numero de veces es "+maxVal);

     
como cada computador est procesando remotamente la bsqueda, 
esto tiene sentido hacerlo en forma paralela. 


   public MiThread extends Thread {

      String nombreComp;
      int veces; 

      MiThread(String  s) {
         ncomp = s;
      }

    public void run() {
        Socket s = new Socket(nombreComp,7777);
        BufferedReader in = new BufferedReader(
                         new InputStreamReader( s.getInputStream());
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);
        out.println("nombres");
        out.println(patron);
        int veces = Integer.parseInt(in.readLine());
   }

   String getNombre() { return nombreComp;}
   String getVeces() { return veces; }
}

Con lo que el programa principal quedara: 


 
    String nombreCompMax = null;
    int i = 0; 
    BufferedReader inArch = new BufferedReader(new 
                                       FileReader("computadores"));
    String patron = inArch.readLine();
    MiThread[] threads = new MiThread[100];
    while( (nombreComp = inArch.readLine()) != null) {
        threads[i] = new MiThread(nombreComp);
        threads[i].start(); 
        i++;
     }

     for (j = 0; j < i; j++)
         threads[i].join();
   

     int maxVeces = 0;
     String compMAx = null; 
     for (j = 0; j < i; j++)
         if (threads[i].getVeces() > maxVeces) {
              maxVeces = threads[i].getVeces();
              compMAx = threads[i].getNombre();
         }

     System.out.println("El comp es "+compMAx+
                              " el numero de veces es "+maxveces);