2012-02-26 10 views
6

Per scopi didattici, ho provato a creare un server e un client in cui il server riceve i dati da più client e fa eco a ogni messaggio. Il problema è quando provo a fare in modo che il server invii l'eco a tutti i client contemporaneamente.Non è possibile accedere all'istanza del tipo ... accessibile

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); 
    } 
    } 
}  

Ho cercato e risposto e ho visto molte domande simili, ma nessuno di loro mi ha aiutato. Spero che tu possa indicare il mio errore. Grazie in anticipo.

+1

Possibile duplicato di [Java - Nessuna istanza di tipo enclosure di cui Foo è accessibile] (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – Raedwald

risposta

14

La classe nidificata richiede un'istanza della classe esterna, perché non è statica, ma non si dispone di un'istanza della classe esterna.

Provare a effettuare entrambe le classi nidificate static. Non sembra che abbiano necessario un riferimento alla classe esterna comunque.

In effetti, sarei tentato di evitare l'uso di classi nidificate per questo - mentre le classi annidate possono certamente essere utili a volte, hanno vari casi d'angolo, ed è in genere più pulito creare tipi di livello superiore separati.

+0

Questo è stato il problema grazie. Ho avuto una lezione con Enum e anche una classe interiore. Stavo prendendo un approccio troppo C# alla programmazione Java. – anon58192932

Problemi correlati