相互に通信する 3 つのノードを持つネットワークを作成したいと考えています。より詳細には、私がしようとしていることは次のとおりです。
- サーバー クライアント モデルを 1 つのプロジェクトとして作成し、そのプロジェクトをさらに 2 つにコピーすると、3 つのノードが作成されます。
- もちろん、ポートを変更することで、プロジェクトを別のコンピューターに分割しても、それらを通信させることができます
- その後、あるプロジェクトから他の2つのノードに時間を送信し(タイムラグを作成して)、他の2つのノードから逆に送信し、平均時間を見つけます。
- 単一のサーバーと単一のクライアントを作成したくありません。スレッドを使用して、単純な「実行」で実行される統合サーバークライアントを作成したいと考えています。
私が抱えている問題は、最初に開始するノードも最初に終了し、残りのノードがぶら下がったままになり、無限ループに陥ることです。また、私が何をすべきかわからないことに行き詰まっていることもあります。
これまでのところ、私はこれを作っています:
サーバ:
public class Server implements Runnable{
private int port;
private String name;
public Server(int port, String name){
this.port=port;
this.name=name;
}
public synchronized void run(){
while(true){
try{
Thread.sleep(5000);
method();
}
catch(Exception e){
return;
}
}
}
public synchronized void method() throws Exception{
double sum=0;
double average=0;
double[] values = new double[10];
ServerSocket server = new ServerSocket(port);
Socket s=server.accept();
InputStream in= s.getInputStream();
OutputStream out = s.getOutputStream();
PrintWriter w = new PrintWriter(out);
Scanner r = new Scanner(in);
for(int i=0; i<10; i++){
String msg = r.next();
sum = Double.parseDouble(msg);
values[i] = sum;
}
for(int j=0; j<values.length; j++){
average = average + values[j];
}
System.out.println(name+": "+average/10);
}
}
クライアント:
public class Client implements Runnable{
private int port;
private int id;
public Client(int port,int id){
this.port=port;
this.id = id;
}
public synchronized void run(){
try{
Thread.sleep(5000);
method();
}
catch(Exception e){
return;
}
}
public synchronized void method() throws Exception{
int num=0;
Random ran = new Random(10);
int d = 0;
Socket s = new Socket("localhost", port);
InputStream in= s.getInputStream();
OutputStream out = s.getOutputStream();
PrintWriter w = new PrintWriter(out);
Scanner r = new Scanner(in);
for(int i=0; i<10; i++){
d = ran.nextInt(10);
System.out.println("Client "+id+" sent "+d);
w.println(d);
w.flush();
}
}
}
そして、私はそれらを次のように実行します:
public class Networks {
public static void main(String[] args) {
Server s = new Server(5000, "Server 0");
Server s2 = new Server(5001, "Server 1");
Client c = new Client(5002, 11);
Client c2 = new Client(5004, 22);
Thread t1 = new Thread(s);
Thread t2 = new Thread(c);
Thread t3 = new Thread(c2);
Thread t4 = new Thread(s2);
t1.start();
t2.start();
t3.start();
t4.start();
try{
t1.join();
t2.join();
t3.join();
t4.join();
}
catch(Exception e){
System.out.println("something");
}
}
}
テストのために同じプロジェクトをさらに2回作成したため、ポートなどは無視できます。また、method() メソッドはテスト用であり、結果が返されますが、出力から 3 つのプロジェクトすべてを実行すると、最初のプロジェクトのクライアントは何も送信せず、両方のサーバーから結果を取得し、2 番目のクライアントは 1 つしか動作しません。私はサーバーの結果を1つだけ取得し、3番目のプロジェクトではクライアントのみが送信しますが、サーバーは何も返しません。出力が完了すると、最初のプロジェクトが完了して終了し、残りの 2 つが永久に実行されます。