如何创建完全连接的客户图?

时间:2012-11-14 01:06:55

标签: java multithreading sockets

在Java中使用Socket类,我正在尝试创建一个由六个客户端组成的网络,每个客户端相互连接。

到目前为止,我已经有了体面的想法,我想,我只是不确定如何做到这一点。

基本上,我有一个存储在String数组中的主机名列表。我打开一个ssh连接到我将要使用的每台机器,并逐个启动我的客户。

第一个客户端找到其主机名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

这似乎很简单,但我是否在思考呢?过度简化了吗?

1 个答案:

答案 0 :(得分:2)

马上你犯了一个新手的错误:

if(localHostName == hostNames[i])

始终为false,因为在 java ==运算符会比较对象标识 - 即两个对象是相同的对象。你想要的是:

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


接下来,Thread[]的想法很好,但是将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();
}