2017-05-30 4 views
0

Ich habe eine einfache Client/Server-Anwendung. Ich versuche auf die Arraylist von UI zuzugreifen, bekomme aber eine leere Arraylist zurück. Ich habe jede mögliche Lösung im Internet versucht, aber keine hat in meinem Fall funktioniert.ArrayList ist leer, wenn von einem separaten Thread aus zugegriffen wird, obwohl es ausgefüllt ist.

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

Dies ist ein MouseClickeed Methode in meiner UI-Klasse ist, wo ich die Arraylist in Serverklasse

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

Haben Sie Ihren Client schon mit dem Server verbunden? – haifzhan

+0

Ja, bereits verbunden und zur Liste hinzugefügt. Das ist sicher. –

+0

Bitte formatieren Sie Ihren Code - es ist viel schwieriger zu lesen, wenn es nicht eingerückt ist. (Und das ist eindeutig nicht Ihr richtiger Code, da die Schrägstriche rückwärts sind ...) –

Antwort

0

Sie sind nicht nur die Arbeit mit separaten Threads zugreifen möchten, Du arbeitest mit verschiedenen Prozessen.

Der Serverprozess verfügt über eine eigene Server.class-Instanz. Der Client wird in einem anderen Java-Prozess gestartet, er könnte dieselben Klassen verwenden, aber es werden verschiedene Instanzen sein, selbst die statischen Felder werden in verschiedenen Prozessen unterschiedlich sein.

Wenn Sie Daten vom Server im Client benötigen, benötigen Sie eine Art von Kommunikation. Sie haben bereits tcp/ip socket, so dass Sie die Liste über den Socket senden können.

Oder Sie könnten eine verteilte Cache-Bibliothek verwenden, wenn Sie dieses Muster in einer großen Anwendung verwenden möchten. Z.B. hazelcast oder Terrakotta DSO

0

Es sieht so aus, als ob Sie versuchen, Objekte aus Server-Anwendung in Client-Anwendung mit UI zu verwenden.

Server und Client-App sind zwei verschiedene Prozesse. Server.clients wird mit Werten in Ihrer Server-App initialisiert und in Ihrer Client-App nicht initialisiert.

Verwandte Themen