0

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

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

基本上,我有一个存储在字符串数组中的主机名列表。我打开到我将使用的每台机器的 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

这似乎很简单,但我是不是想多了?过于简单化了?

4

1 回答 1

2

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

if(localHostName == hostNames[i])

将永远是false,因为在java中,==运算符比较对象身份- 即两个对象是同一个对象。你想要的是:

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


接下来,Thread[]思路不错,不过传入aRunnable给线程,启动线程。让您的班级使用实例字段来连接主机名(班级不需要知道自己的主机名)。

像这样的东西:

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 回答