gpt4 book ai didi

java - 如何使两个单独的客户端共享来自服务器的相同数据?

转载 作者:行者123 更新时间:2023-12-01 10:54:56 29 4
gpt4 key购买 nike

我有这个服务器和客户端应用程序,可以计算按钮被单击的次数。这里的其他一些成员很友善地解决了我之前的问题,现在我有了另一个问题。

当我启动服务器,客户端连接,并且客户端单击按钮时,服务器端的计数器就会增加。但是,当第二个客户端连接到服务器时,计数器重置为 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 类中。只是在代码框中看起来并不是这样。

最佳答案

您需要一个线程安全的共享计数器。我会去

  public static AtomicInteger totalBets = new AtomicInteger (0);

您必须更改一些 getter 和 setter,但这应该在客户端之间共享值(value)。或者丢弃这些方法并简单地执行

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

关于java - 如何使两个单独的客户端共享来自服务器的相同数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33659456/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com