不能访问类型为…的封闭实例

出于教育目的,我尝试创建服务器和客户端,服务器从多个客户端接收数据并回显每条消息。 问题是当我尝试让服务器立即向所有客户端发送回声时。

public class SocketServer { ArrayList ts = new ArrayList(); 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); } } } 

我搜索并回答并看到了许多类似的问题,但没有一个能帮助我。 希望你能指出我的错误。 提前致谢。

您的嵌套类需要外部类的实例,因为它不是静态的 – 但您没有外部类的实例。

尝试将两个嵌套类都设置为static 。 看起来他们不需要引用外层类。

事实上,我总是试图避免使用嵌套类 – 虽然嵌套类有时候肯定是有用的,它们有各种各样的极端情况,并且创建单独的顶级类型通常更简洁。