2015-11-11 4 views
0

У меня есть это серверное и клиентское приложение, которое подсчитывает, сколько раз нажата кнопка. Некоторые другие участники здесь были достаточно любезны, чтобы решить мою предыдущую проблему, и теперь у меня есть другой.Как сделать двух отдельных клиентов одинаковыми данными с сервера?

Когда я запускаю сервер и клиент подключается, и клиент нажимает кнопку, счетчик на стороне сервера увеличивается. Однако, когда второй клиент подключается к серверу, счетчик сбрасывается до 0. Я думаю, что по какой-то причине сервер создает отдельный экземпляр счетчика.

Здесь (обновлена) сервер сторонний код:

public class Server { 


public static void main(String[] args) throws Exception { 
    Socket socket = null; //create a new socket 
    ServerSocket listener = new ServerSocket(9898); 
    System.out.println("The server is running!"); 
    try { 
     while (true) { 
      new ClickServer(listener.accept()).start(); 
     } 
    } finally { 
     listener.close(); 
    } 
} 


/** 
* A private thread to handle clicking requests 
*/ 
private static class ClickServer extends Thread { 
    private Socket socket; 
    AtomicInteger totalBets = new AtomicInteger(0); 

    public void incrementTotalBets() { 
     totalBets.incrementAndGet(); 

    } 

    public int getTotalBets() { 
     return totalBets.get(); 
    } 



    public ClickServer(Socket socket) { 
     this.socket = socket; 
     log("New connection with client at " + socket); 
    } 
    public void run() { 
     try { 
      while (true) { 
       socket.setTcpNoDelay(true); 

       InputStream is = socket.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String input = br.readLine(); 

       OutputStream os = socket.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 

       if(input.equals("increment")) { 

        bw.write(String.valueOf(totalBets.incrementAndGet())); 
        bw.newLine(); 
        bw.flush(); 
        System.out.println("Total Bets: " + getTotalBets()); 
       } 
      } 
     } catch (IOException e) { 
      log("Error handling client\n" + e); 
     } finally { 
      try { 
       socket.close(); 
      } catch (IOException e) { 
       log("Error closing socket"); 
      } 
      log("Connection with client closed"); 
     } 
    } 

    private void log(String message) { 
     System.out.println(message); 
    } 
} 
} 

totalBets целое число, это счетчик. Когда несколько клиентов присоединяются к серверу и нажимают кнопку, он должен увеличивать счетчик и отправлять его обратно на основе того, что счетчик уже есть. Он не должен быть сброшен для каждого нового клиента.

Вот соответствующий клиент-сторонний код:

public void actionPerformed(ActionEvent arg0) { 
      try { 
       OutputStream os = socket.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 
      String target = ""; 
      bw.write("increment" + "\n"); 
      bw.flush(); 
      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String id = br.readLine(); 
      System.out.println("bet added: " + id); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 

Я не уверен, почему новый экземпляр сервера создается каждый раз, когда подключается новый клиент. Я сделал некоторую отладку, и сервер знает, что на одном и том же порту подключено более одного клиента, подключенного к серверу.

Любая помощь?

Спасибо.

ПРИМЕЧАНИЕ: класс ClickServer вложен в класс Server. Это просто не выглядит так в кодовом окне.

ответ

1

Вам нужен общий счетчик, который является потокобезопасным. Я бы поехал за

public static AtomicInteger totalBets = new AtomicInteger (0); 

Вам нужно было бы изменить геттер и сеттер, но это должно делиться ценностью между Клиентами. Или мусор эти методы и просто сделать

  if(input.equals("increment")) { 
       bw.write(String.valueOf(totalBets.incrementAndGet())); 
+0

Спасибо за ответ. Я попробовал это, и они все еще не разделяют ценность. Второй клиент по-прежнему начинается с 0. –

+0

Не могли бы вы поделиться обновленным кодом? И totalBets была сделана статическая переменная-член? – Jan

+0

Я обновил серверный код в главном сообщении. EDIT: Ох! Это было не статично! Теперь это работает! Спасибо! –

0

Попробуйте изменить:

public int totalBets = 0; 

к:

public static int totalBets = 0; 
Смежные вопросы