2012-02-26 30 views
6

Eğitim amaçlı olarak, sunucunun birden çok istemciden veri aldığı ve her bir iletiyi yankıladığı bir sunucu ve istemci yapmaya çalıştım. Sorun, sunucunun ekoyu aynı anda tüm istemcilere göndermeye çalıştığı zamandır.Tür kapama örneği yok ...

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

Aradım ve cevap verdim ve benzer birçok soru gördüm, ancak bunların hiçbiri bana yardımcı olmadı. Umarım benim hatamı gösterebilirsin. Şimdiden teşekkürler.

+1

Olası kopyası [Java - Foo türünde kapalı örnek yok erişilebilir] (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – Raedwald

cevap

14

Yuvalanmış sınıfınız, dış sınıfın bir örneğini gerektirir, çünkü bu statik değildir; ancak , dış sınıfın bir örneğine sahiptir.

İç içe geçmiş sınıflarınızın her ikisini de static yapmayı deneyin. nolu dış sınıfa bir başvuruya ihtiyaç duyuyor gibi görünmüyor. Aslında, iç içe geçmiş sınıfları kullanmaktan kaçınmak isterim - iç içe geçmiş sınıflar bazen yararlı olabilirler, çeşitli köşe durumları olabilirler ve tipik olarak üst düzey tipler oluşturmak için daha temizdirler.

+0

Bu sorun oldu. Enums ve bir iç sınıf ile doldurulmuş bir sınıf vardı. Java programlamaya çok C# yaklaşıyordum. – anon58192932

İlgili konular