2017-05-30 2 views
0

私は単純なクライアント/サーバーアプリケーションを持っています。私はUIからarraylistにアクセスしようとしますが、代わりに空のarraylistを取得します。私はインターネット上のあらゆる可能な解決策を試しましたが、私の場合は何も働いていません。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); 
} 
} 
} 

これで私はあなただけの別のスレッドで作業していない

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

サーバ・クラスでのArrayListにアクセスしたい私のUIクラスのMouseClickeed方法、異なるプロセスで作業しています。

サーバープロセスには独自のServer.classインスタンスがあります。クライアントは異なるJavaプロセスで起動されますが、同じクラスを使用できますが、異なるインスタンスでも、静的フィールドはプロセスによって異なります。

クライアントのサーバーからのデータが必要な場合は、何らかの通信が必要です。すでにtcp/ipソケットがあるので、ソケット経由でリストを送ることができます。

大きなアプリケーションでこのパターンを使用する場合は、分散キャッシュライブラリを使用することもできます。例えば。 hazelcastまたはTerracotta DSO

0

UIを使用してクライアントアプリケーションのサーバーアプリケーションからオブジェクトを使用しようとしているようです。

サーバーとクライアントアプリケーションは、2つの異なるプロセスです。 Server.clientsはサーバーアプリケーションの値で初期化され、クライアントアプリケーションでは初期化されません。

関連する問題