有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

单模式下带服务器客户端的Java网络

我想创建一个包含3个相互通信的节点的网络。更详细地说,我试图:

  • 创建一个服务器-客户机模型作为单个项目,然后再复制两个项目,在那里我有三个节点
  • 当然,通过改变端口,我可以让它们进行通信,即使我在不同的计算机上拆分项目
  • 之后,我希望从一个项目将时间(一些弥补的时间滞后)发送到其他2个节点,从其他2个节点发送到vice verca,然后找到平均时间
  • 我不想创建单一服务器和单一客户机,我想使用线程来创建一个统一的服务器客户机,通过简单的“运行”来运行

我遇到的问题是,先开始的节点也先结束,剩下的节点挂起,处于无休止的循环中。还有一点是,我不知道该怎么办

到目前为止,我已经做到了:

服务器:

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");
        }

    }
}

你可以忽略端口和其他东西,因为我已经为测试创建了同一个项目两次以上。同样,method()方法只是用于测试,我确实会得到结果,但当我从输出中运行所有3个项目时,我得到第一个项目的客户端不发送任何内容,我从两个服务器上都得到结果,第二个项目的客户端只工作1个,我只得到1个服务器结果,在第三个项目中,只有客户端发送,但服务器不返回任何内容。当输出完成时,第一个项目完成并结束,另两个项目永远运行


共 (1) 个答案

  1. # 1 楼答案

    也许:

    1. 你正在吞咽客户端中的异常
    2. 您正在同时启动所有4个线程
    3. 存在一种竞争条件,客户机可以在服务器侦听/接受之前启动并尝试在套接字上发送
    4. 当服务器启动时,客户端已经出错,服务器将永远等待

    这只是一个理论,但看起来可能是这样