2012-02-26 4 views
6

Для образовательных целей я попытался создать сервер и клиент, где сервер получает данные от нескольких клиентов и эхо каждого сообщения. Проблема в том, что я пытаюсь заставить сервер отправлять эхо всем клиентам сразу.Нет доступного экземпляра типа ...

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

Я искал и отвечал и видел много подобных вопросов, но никто из них не помог мне. Надеюсь, вы можете указать на мою ошибку. Заранее спасибо.

+1

Возможный дубликат [Java - нет экземпляра экземпляра типа Foo доступен] (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – Raedwald

ответ

14

Ваш вложенный класс требует экземпляра внешнего класса, потому что он не является статическим - но вы не имеете экземпляр внешнего класса.

Попробуйте сделать оба ваших гнездовых класса static. Не похоже, чтобы нуждался в ссылке на внешний класс.

Фактически, у меня возникнет соблазн избежать использования вложенных классов для этого - в то время как вложенные классы могут быть иногда полезны, у них есть различные угловые случаи, и, как правило, более чистые, чтобы создавать отдельные типы верхнего уровня.

+0

Это была проблема. У меня был класс, наполненный Enums и внутренним классом. Я использовал слишком C# подход к программированию на Java. – anon58192932

Смежные вопросы