0

我正在尝试使用 java 套接字创建一个客户端-服务器程序。我有一些客户端和服务器。客户端将有关其 CPU 负载的信息发送到服务器,然后来自客户端的所有信息都由服务器保存到一个 xml 文件中。客户端会定期(例如每 5 分钟)发送此信息。

从技术上讲,我有一个问题需要控制,以及在每个客户端都发送了他们的 CPU 负载之后如何解决这个问题。任何人都可以帮忙吗?这是我的代码的一部分,

public void listenSocket(){ 
        int client=0;
        while(client<2){
            ClientWorker w;
              try{  
                    w = new ClientWorker(server.accept());
                    Thread t = new Thread(w);
                    t.start();
                    CpuLoad[client]=w.getLoad();
                    Ip[client]=w.getIP();
              } catch (IOException e) {
                    System.out.println("Accept failed: 4444");
                    System.exit(-1);
              }
           client++;
        }

        XmlGenerator xml = new XmlGenerator();

        try{
            xml.generate(CpuLoad, Ip);
            System.out.println("file generated");
        }catch(Exception e){
            System.out.println("Can't generate file");
        }

}

我以为我的算法是对的,但还是有错误:

Exception in thread "main" java.lang.NullPointerException
           at server.ServerOne.listenSocket(ServerOne.java:39)

这是一类客户工作者

class ClientWorker implements Runnable{
    Socket client;
    String ip;
    String load;
    String data[]=new String[7];


    ClientWorker(Socket client){
    this.client = client;
}

public void setIP(String ip){
        this.ip = ip;
    }

    public void setData(String load){
        this.load = load;
    }

    public String getIP(){
        return ip;
    }

    public String getData(){
        return load;
    }

public void run(){

    BufferedReader in = null;
    PrintWriter out = null;

    try{
      in = new BufferedReader(new InputStreamReader(client.getInputStream()));
      out = new PrintWriter(client.getOutputStream(), true);
    } catch (IOException e) {
      System.out.println("in or out failed");
      System.exit(-1);
    }

            try{
                String a = in.readLine();
                setData(a);
                String b = client.getInetAddress().toString();
                setIP(b);
        //Send data back to client
                out.println(a);
                System.out.println(a);     
            }catch (IOException e) {
                System.out.println("Read failed");
            }

}

}
4

1 回答 1

0

此代码中的问题是您的 ClientWorker 和“master”之间缺乏同步机制。您为工作人员启动一个线程,然后在 1 条指令后询问其任务的结果。这就像老师给你作业,一分钟后问结果。你打算说什么?“对不起,我没有”,或者翻译成你的代码,“空指针异常”。

你需要一种方法让 Worker 完成它的工作。只有在工人有事情要报告后,您才要求结果。这是作业,我不会完成你的代码。你应该调查:

还有我最喜欢的:

我读过的关于这个主题的最好的书:

随时发布有关特定问题的新问题。

于 2012-07-18T09:43:22.900 回答