2012-02-26 14 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

की संभावित डुप्लिकेट - (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – Raedwald

उत्तर

14

आपके नेस्टेड क्लास को बाहरी वर्ग का एक उदाहरण चाहिए, क्योंकि यह स्थिर नहीं है - लेकिन आप बाहरी वर्ग का एक उदाहरण नहीं है।

अपने दोनों नेस्टेड कक्षाएं static बनाने का प्रयास करें। ऐसा लगता है कि वे की आवश्यकता नहीं है बाहरी वर्ग के संदर्भ में वैसे भी।

असल में, मैं इसके लिए नेस्टेड कक्षाओं का उपयोग करने से बचने के लिए प्रेरित हूं - जबकि नेस्टेड कक्षाएं निश्चित रूप से कभी-कभी उपयोगी हो सकती हैं, उनके पास विभिन्न कोने के मामले होते हैं, और यह आमतौर पर अलग-अलग शीर्ष-स्तरीय प्रकार बनाने के लिए क्लीनर होता है।

+0

[जावा प्रकार फू का कोई enclosing उदाहरण पहुँचा जा सकता है] यह समस्या समस्या थी। मेरे पास एनम्स और एक आंतरिक कक्षा के साथ एक कक्षा थी। मैं जावा प्रोग्रामिंग के लिए एक सी # दृष्टिकोण ले रहा था। – anon58192932

संबंधित मुद्दे