2012-02-26 16 views
6

W celach edukacyjnych próbowałem utworzyć serwer i klienta, w których serwer otrzymuje dane od wielu klientów i odtwarza echo każdej wiadomości. Problem polega na tym, że staram się, aby serwer wysyłał echo do wszystkich klientów jednocześnie.Żadna obudowa typu ... nie jest dostępna.

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

Szukałem i odpowiadałem i widziałem wiele podobnych pytań, ale żaden z nich nie pomógł mi. Mam nadzieję, że możesz wskazać mój błąd. Z góry dziękuję.

+1

Prawdopodobny duplikat [Java - brak dostępnej instancji typu Foo] (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – Raedwald

Odpowiedz

14

Twoja zagnieżdżona klasa wymaga instancji klasy zewnętrznej, ponieważ nie jest statyczna - ale nie musisz mieć instancji klasy zewnętrznej.

Spróbuj utworzyć obie zagnieżdżone klasy static. Wygląda na to, że nie są one w żaden sposób związane z zewnętrzną klasą.

W istocie, byłbym pokusą, aby w ogóle nie używać w tym celu klas zagnieżdżonych - podczas gdy klasy zagnieżdżone z pewnością mogą być czasem przydatne, mają różne przypadki narożne, a zazwyczaj tworzenie bardziej osobnych typów najwyższego poziomu jest czystsze.

+0

To był problem dzięki. Miałem zajęcia z Enums i wewnętrzną klasę. Brałem zbyt podejście C# do programowania w języku Java. – anon58192932

Powiązane problemy