0

JavaのSocketクラスを使用して、それぞれが相互に接続されている6つのクライアントのネットワークを作成しようとしています。

私はこれまでのところ適切なアイデアを持っていると思いますが、これを行う方法がよくわかりません。

基本的に、String配列に格納されているホスト名のリストがあります。使用する各マシンへのssh接続を開き、クライアントを1つずつ起動します。

最初のクライアントは、でホスト名を見つけ、InetAddress.getLocalHost().getHostName()これをホスト名リストと比較して、NodeIDを計算します。

for(i = 0; i < hostNames.length; i++){
    if(localHostName == hostNames[i]){
        NodeID = i;
        break;
    }
    ...

ですから、これが私にとって難しい部分です。この時点で、でクライアントに接続しますhostNames[i]。私の計画は、クライアントごとに接続ごとに異なるスレッドを用意することでした。これらのスレッドを作成するにはどうすればよいですか?事前にスレッド配列を設定し、この時点でスレッドを定義する必要がありますか?

Thread[] connections = new Thread[]();
...
    //in for loop
    connections[i] = new Thread(new ConnectionThread().start(hostNames[i]));
    // ConnectionThread being a tentative name for a custom class

これは簡単なことのように思えますが、私はそれを考えすぎていますか?単純化しすぎていますか?

4

1 に答える 1

2

すぐにあなたは初心者の過ちを犯しました:

if(localHostName == hostNames[i])

Javaでは、演算子がオブジェクトのIDfalseを比較するため、常にになります。つまり、2つのオブジェクトは同じオブジェクトです。あなたが欲しいものは:==

if(localHostName.equals(hostNames[i]))


次に、Thread[]アイデアは良いですが、スレッドにaを渡して、スレッドRunnableを開始します。接続するホスト名のインスタンスフィールドをクラスで使用するようにします(クラスは自身のホスト名を知る必要はありません)。

このようなもの:

public class MyServer implements Runnable {

    private final String[] hostnames;

    public MyServer(String... hostnames) {
        this.hostnames = hostnames;
    }

    public void run() {
       for (String hostname : hostnames) {
           // connect to hostname
       }
    }

}

次に、メインで(単純に):

Thread[] threads = new Thread[6];
threads[0] = new Thread(new MyServer("foo", "bar"));
threads[1] = new Thread(new MyServer("bar", "dog"));
...
for (Thread thread : threads) {
    thread.start();
}
于 2012-11-14T01:42:14.207 に答える