У меня есть это серверное и клиентское приложение, которое подсчитывает, сколько раз нажата кнопка. Некоторые другие участники здесь были достаточно любезны, чтобы решить мою предыдущую проблему, и теперь у меня есть другой.Как сделать двух отдельных клиентов одинаковыми данными с сервера?
Когда я запускаю сервер и клиент подключается, и клиент нажимает кнопку, счетчик на стороне сервера увеличивается. Однако, когда второй клиент подключается к серверу, счетчик сбрасывается до 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
. Это просто не выглядит так в кодовом окне.
Спасибо за ответ. Я попробовал это, и они все еще не разделяют ценность. Второй клиент по-прежнему начинается с 0. –
Не могли бы вы поделиться обновленным кодом? И totalBets была сделана статическая переменная-член? – Jan
Я обновил серверный код в главном сообщении. EDIT: Ох! Это было не статично! Теперь это работает! Спасибо! –