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)

これはClientworkerのクラスです

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 と「マスター」の間の同期メカニズムがないことです。ワーカーのスレッドを開始し、1 命令後にそのタスクの結果を要求します。先生が宿題を出して、1 分後に結果を聞くようなものです。あなたは何と言うでしょう?「申し訳ありませんが、持っていません」、またはコードに翻訳すると、「Null Pointer Exception」になります。

ワーカーに仕事をさせる方法が必要です。ワーカーが何か報告する必要がある場合にのみ、結果を要求します。これは宿題なので、コードを完成させません。あなたは調べる必要があります:

そして私のお気に入り:

このトピックに関して私が読んだ中で最高の本:

特定の問題に関する新しい質問を自由に投稿してください。

于 2012-07-18T09:43:22.900 に答える