应用程序客户端服务器,错误的累加器编号

app client server, wrong accumulator number

我创建了一个基于套接字的客户端服务器应用程序......这就是它基本上必须做的...... 定义基于套接字的客户端服务器应用程序。服务器必须能够同时响应多个客户端。 服务器生成一个正整数值 N,用于每个连接的客户端。 连接时,客户端随机生成一个整数M。 然后客户端向服务器M发送正整数值。 传输以发送值 -1 结束。 每次客户端完成传输时,服务器将到目前为止从所有客户端收到的大于 N 的值的数量写入屏幕。 如有必要,管理同步问题。

这就是我设法做到的....不过我有疑问.. 当我 运行 客户端时,它告诉我它发送了多少个正整数,例如 40 ....然后服务器会告诉我其中有多少大于客户端生成的数字 N,例如 10 .... 但如果我再次 运行 客户端,这将把以前大于 N 的整数与大于 N 的新整数相加,给我一个不正确的结果。 现在我想知道......这是正常的还是我做错了什么?

        package server;
        import java.io.IOException;
        import java.net.ServerSocket;
        import java.net.Socket;
        import java.util.logging.Level;
        import java.util.logging.Logger;


        public class Server {


 public static void main(String[] args) {
      try {
        ServerSocket s = new ServerSocket(5555);
        int N;
        N = (int)(Math.random()*100);
        System.out.println("Server online, il numero N che adopera è : "+N);

        Accumulatore a = new Accumulatore();
        while(true){
        Socket client = s.accept();
        ThreadServer t = new ThreadServer(client,N,a);
        t.start();
        
       
        
        }
        
         
        
           // TODO code application logic here
        } catch (IOException ex) {
          Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
       // TODO code application logic here
     }
     }
   }      




        package server;
        import java.io.*;
        import java.net.Socket;
        import java.util.logging.Level;
        import java.util.logging.Logger;


        public class ThreadServer extends Thread{

       Socket s ;
       int M;
      Accumulatore acc;

      public ThreadServer(Socket s, int M, Accumulatore acc) {
      this.s = s;
      this.M = M;
      this.acc = acc;
        } 

        @Override
       public void run(){
        try {
        DataInputStream data = new DataInputStream(new BufferedInputStream(s.getInputStream()));
        int n;
        while((n = data.readInt())!=-1){
            if(n>M){
                acc.incrementa();
            }
        }
         System.out.println("Valori più grandi di "+M +" ricevuti : "+ acc.getn());
    
        
       data.close();    //////diocaneeeeeeeee
        s.close();
    } catch (IOException ex) {
        Logger.getLogger(ThreadServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}





      package client;

      import java.io.DataOutputStream;
      import java.io.IOException;
      import java.io.OutputStream;
      import java.net.Socket;
      import java.util.logging.Level;
      import java.util.logging.Logger;


      public class Client {


      public static void main(String[] args) {
    
      try(Socket client = new Socket("localhost",5555); 
          OutputStream i1 = client.getOutputStream();  
            DataOutputStream out = new DataOutputStream(i1);) {
        
        int M;
        M= (int)(Math.random()*100);
        System.out.println("Invierò "+M+" interi positivi");

        // TODO code application logic here
        for(int i = 0; i<M; i++){
            int l;
            l = (int)(Math.random()*100);
            out.writeInt(l);
            out.flush();
        }
        out.writeInt(-1);
        out.flush();
        
    } catch (IOException ex) {
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
    }
     }

      }



        package server;


        public class Accumulatore {

        private int n = 0;    


       synchronized public void incrementa(){
      n++;        
     }
     public int getn(){
      return n;
   }

   }

正如@Armali 在评论中所写 - 是否错误取决于应用程序要求。应用程序逻辑有一个类 Accumulatore 的实例。此实例在来自客户端的任何连接之前创建,并总结所有即将到来的连接。创建新连接时,服务器使用相同的 Accumulatore 实例。

如果应该为每个连接单独计算数量,您需要在 main 方法中接收到新连接时创建一个单独的 Accumulatore 实例。类似的东西:

...
N = (int)(Math.random()*100);
System.out.println("Server online, il numero N che adopera è : "+N);
while(true) {
    Socket client = s.accept();
    Accumulatore a = new Accumulatore();
    ThreadServer t = new ThreadServer(client,N,a);
    t.start();
...