在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
这似乎很简单,但我是否在思考呢?过度简化了吗?
答案 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();
}