2017-05-30 61 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使用服務器應用程序中的值進行初始化,並且未在客戶端應用程序中進行初始化。