多线程,Java服务器/客户端项目

多线程,Java服务器/客户端项目,java,multithreading,Java,Multithreading,您好,我目前正在使用Java开发一个服务器/客户端程序,其中客户端连接到服务器并向服务器发送一个数字,然后服务器将该数字添加到全局变量并返回全局变量。 我遇到的问题是,当我有多个客户端时,一个客户端不工作,而另一个客户端工作,在后期创建的客户端工作。 我为每个客户机创建了单独的线程,并在一定程度上起作用 这是创建新线程的服务器类的片段 public static Integer globalSum = 0; public static void main(String[] args) thro

您好,我目前正在使用Java开发一个服务器/客户端程序,其中客户端连接到服务器并向服务器发送一个数字,然后服务器将该数字添加到全局变量并返回全局变量。 我遇到的问题是,当我有多个客户端时,一个客户端不工作,而另一个客户端工作,在后期创建的客户端工作。 我为每个客户机创建了单独的线程,并在一定程度上起作用

这是创建新线程的服务器类的片段

public static Integer globalSum = 0;

public static void main(String[] args) throws IOException
{

    ServerSocket server = new ServerSocket(8888);
    Socket s;

    System.out.println("Server running. Waiting for a client to connect...");

    while(true) {

        s = server.accept();
        ThreadHandler th=new ThreadHandler(s);
        Thread t=new Thread(th);
        t.start();
        System.out.println("Client is now connected");

    }
}
这是我的客户端类

public class Client2 {

    public static void main(String[] args) throws IOException {
        Socket s = new Socket("localhost", 8888);
        InputStream instream = s.getInputStream();
        OutputStream outstream = s.getOutputStream();
        Scanner in = new Scanner(instream);
        Scanner input= new Scanner(System.in);
        PrintWriter out = new PrintWriter(outstream);

        for(int i=0;i<5;i++){
            System.out.println("Please enter a value "+(i+1));
            String response=input.nextLine();
            String request="SUBMIT"+" "+response+"\n";
            out.print(request);
            out.flush();
            System.out.println(in.nextLine());
        }

        out.print("QUIT\n");
        out.flush();

        s.close();
    }

}
公共类客户端2{
公共静态void main(字符串[]args)引发IOException{
套接字s=新套接字(“本地主机”,8888);
InputStream instream=s.getInputStream();
OutputStream outstream=s.getOutputStream();
扫描仪输入=新扫描仪(流内);
扫描仪输入=新扫描仪(System.in);
PrintWriter out=新的PrintWriter(分流);

对于(int i=0;i你确定这件事:

private static PrintWriter out;
必须是静态的?这意味着所有线程共享您的输出流

  • 你们有什么样的错误
  • 为什么打印输出是静态的
  • 不管怎样,我要换一个

    public static Integer globalSum = 0;
    

    并一次性获取值:

    myValueAtThisTime =  globalSum.addAndGet(valueInt);
    

    也许这不是你问题的答案,但我看到了一些看起来像是一个大错误(也是很常见的错误)

    我没有看到ServerInstance.globalSum的声明,但我可以猜,它是一个整数,对吗

    每次指定它时,都会创建一个新对象:

    ServerMultipleClients.globalSum=ServerMultipleClients.globalSum+valueInt;
    
    这意味着,当您的代码在
    服务器multipleclients.globalSum
    上同步时,每个线程都可能在不同的整数对象上同步。这意味着,任意数量的线程都可以同时进入“synchronized”块

    无论何时编写
    synchronized(foo)
    ,您都可能希望foo成为最终变量。例如

    private final Object foo = new Object();
    
    这样,您就可以绝对确保不同的线程不会在不同的实例上同步


    另请注意!如果使用同步(foo)保护静态数据,则foo本身必须是静态的。

    “客户端崩溃”;你能详细说明一下吗?也许是堆栈跟踪?你确定
    静态PrintWriter out
    应该是
    静态的
    ?你真的想让所有结果都转到创建的最后一个
    ThreadHandler
    吗?我怀疑这是你的意图。很好!谢谢
    ServerMultipleClients.globalSum=ServerMultipleClients.globalSum+valueInt;
    
    private final Object foo = new Object();