2012-02-26 15 views
6

Para fines educativos traté de hacer un servidor y un cliente donde el servidor recibe datos de múltiples clientes y hace eco de cada mensaje. El problema es cuando trato de hacer que el servidor envíe el eco a todos los clientes a la vez.No hay ninguna instancia adjunta de tipo ... es accesible

public class SocketServer { 
    ArrayList<MyRunnable> ts = new ArrayList<MyRunnable>(); 
    ServerSocket serv; 
    static MainServerThread mst = new MainServerThread(); 
//        ^IDE(eclipse) underlines this as the problem 
    SocketServer() { 
    EventQueue.invokeLater(mst); 
    } 

    public static void main(String[] args) { 
    Thread tr = new Thread(mst); 
    tr.start(); 
    } 

    void send(String s) { 
    for (int i = 0; i < ts.size(); i++) { 
     MyRunnable tmp = ts.get(i); 
     tmp.sendToClient(s); 
    } 
    } 

    class MainServerThread implements Runnable { 
    public void run() { 
     try { 
     serv = new ServerSocket(13131); 
     boolean done = false; 
     while (!done) { 
      Socket s = serv.accept(); 
      MyRunnable r = new MyRunnable(s); 
      Thread t = new Thread(r); 
      ts.add(r); 
      t.start(); 
     } 
     } catch(Exception e) { 
     e.printStackTrace(); 
     } 
    } 
    } 

    class MyRunnable implements Runnable { 
    Socket sock; 
    PrintWriter out; 
    Scanner in; 
    MyRunnable(Socket soc) { 
     sock = soc; 
    } 

    public void run() { 
     try { 
     try { 
      out = new PrintWriter(sock.getOutputStream(), true); 
      in = new Scanner(sock.getInputStream()); 
      boolean done = false; 
      while (!done) { 
      String line = in.nextLine(); 
      send("Echo: " + line); 
      System.out.println("Echo: " + line); 
      if (line.trim().equals("BYE")) done = true; 
      } 
     } finally { 
      sock.close(); 
     } 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 

    public void sendToClient(String s) { 
     out.println(s); 
    } 
    } 
}  

He buscado y respondido y he visto muchas preguntas similares, pero ninguna de ellas me ha ayudado. Espero que puedas señalar mi error. Gracias por adelantado.

+1

Posible duplicado de [Java - No se puede acceder a ninguna instancia adjunta de tipo Foo] (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – Raedwald

Respuesta

14

Su clase anidada requiere una instancia de la clase externa, porque no es estática, pero no tiene una instancia de la clase externa.

Intente hacer sus dos clases anidadas static. No parece que necesite una referencia a la clase externa de todos modos.

De hecho, estaría tentado de evitar el uso de clases anidadas para esto, mientras que las clases anidadas pueden ser útiles a veces, tienen varios casos de esquina, y es más limpio crear tipos de nivel superior separados.

+0

Este fue el problema gracias. Tuve una clase llena de Enums y una clase interna también. Estaba tomando un enfoque demasiado C# para la programación de Java. – anon58192932

Cuestiones relacionadas