2017-05-30 72 views
0

我有一个简单的客户端/服务器应用程序。我尝试从UI访问数组列表,但返回一个空数组列表。我已经尝试了互联网上的所有可能的解决方案,但没有一个适用于我的案例ArrayList在从单独的线程访问时被清空,尽管它被填充。

Server.java

import java.net.*; 
import java.util.ArrayList; 
import java.io.*; 

public class Server { 
public static ArrayList<MyThread> clients = new ArrayList<MyThread>(); 

public static void main(String args[]) throws IOException { 
ServerSocket s = new ServerSocket(7777); 
try { 
while (true) { 
Socket s1 = s.accept(); 
MyThread t = new MyThread(s1); 
clients.add(t); // adds threads to an ArrayList 
System.out.println(clients); // prints the ArrayList(It works and print all threads) 
t.start(); //start the thread 

} 
} catch (SocketException e) { 
System.out.println("Error: " + e); 
} 
} 
} 

这是一个MouseClickeed方法在我的UI类,我想访问的ArrayList在服务器类

public void mouseClicked(MouseEvent arg0) { 
try { 

String s = textField.getText(); 
Client.ClientName = s; \\ gets the string entered and set it as Client Name 
System.out.println(Server.clients); \\It's supposed to print Client ArrayList but instead it prints an empty List ([]) 


} 

catch (NullPointerException e1) { 
System.out.println("Error: " + e1); 
} 
} 
}); 
+0

是否已将您的客户端连接到服务器? – haifzhan

+0

是的,已连接并添加到列表中。这是肯定的。 –

+0

请格式化您的代码 - 当它没有缩进时更难阅读。 (这显然不是你真正的代码,因为斜杠是倒退的......) –

回答

0

你不只是用单独的线工作,你正在处理不同的流程。

服务器进程有它自己的Server.class实例。客户端在不同的java进程中启动,它可以使用相同的类,但它们将是不同的实例,即使静态字段在不同的进程中也会有所不同。

如果您在客户端需要来自服务器的数据,则需要某种通信。你已经有了tcp/ip套接字,所以你可以通过套接字发送列表。

或者你可以使用一些分布式缓存库,如果你想在大型应用程序中使用这种模式。例如。 hazelcast或兵马俑DSO

0

它看起来像你尝试从客户端应用程序中的服务器应用程序与UI使用对象。

服务器和客户端应用程序是两个不同的进程。 Server.clients使用服务器应用程序中的值进行初始化,并且未在客户端应用程序中进行初始化。