0

こんにちは、日付オブジェクトをクライアントからサーバーに送信して比較できるようにするのに少し問題があります。したがって、基本的に私がやろうとしていることは次のとおりです。1)Dateオブジェクトを送信します2)それらの時間を比較します3)両方のマシンの平均時間を両方のマシンに設定します

これまでのところ、私はこれを行ってきました:

サーバ:

public class Server implements Runnable{
    private int port;
    private String name;
    private Date mydate = new Date();
    private Date date;
    public Server(int port, String name){
        this.port=port;
        this.name=name;
    }
    public synchronized void run(){
        while(true){
        try{

            method();

        }
        catch(Exception e){
            return;
        }

        }
    }

    public synchronized void method() throws Exception{
        long dates;
        long average=0;
        String[] values = new String[10];

        DateFormat df = new SimpleDateFormat("EEE MMM dd kk:mm:ss zzz yyyy");
      ServerSocket server = new ServerSocket(port);

      Socket s=server.accept();

      InputStream in= s.getInputStream();
      OutputStream out = s.getOutputStream();

      PrintWriter w = new PrintWriter(out);
      Scanner r = new Scanner(in);
      for(int i=0; i<10; i++){
      String msg = r.next();
      values[i] = msg;

    }
      for(int j=0; j<values.length; j++){
          dates = Long.parseLong(values[j]);
          date = new Date(dates);
          average = average + date.getTime();
      }
      average = (average - mydate.getTime())/2;
      mydate.setTime(average);
      System.out.println(name+": "+mydate.toString());
}
}

クライアント:

public class Client implements Runnable{
    private int port;
    private int id;
    Date time = new Date();
    Date time2 = new Date();
    public Client(int port,int id){
        this.port=port;
        this.id = id;
    }

    public synchronized void run(){

        try{
            Thread.sleep(5000);

            method();

        }
        catch(Exception e){
            return;
        }

    }

    public synchronized void method() throws Exception{
        DateFormat df = new SimpleDateFormat("EEE MMM dd kk:mm:ss zzz yyyy");
        Random ran = new Random(500);
        int d = ran.nextInt(500)+500;
        time.setTime(time.getTime()+d);
        String datestr;
        Socket s = new Socket("localhost", port);

        InputStream in= s.getInputStream();
        OutputStream out = s.getOutputStream();

        PrintWriter w = new PrintWriter(out);
        Scanner r = new Scanner(in);
        for(int i=0; i<10; i++){
        time.setTime(time.getTime()+d);
        datestr = df.format(time);
        w.println(datestr);
        w.flush();
        }


    }
}

しかし、私が得た結果は「何もない」空白だけです。プログラムはエラーで正常にコンパイルされ、問題がどこにあるかはある程度わかっていますが、値を正しく解析して正しく読み取れるようにする方法がわかりません。私を助けてください:S

4

1 に答える 1

0

クライアントで、SimpleDateFormat でフォーマットされた文字列として日付を送信すると、「Sat Mai 04 22:27:24 PST 2013」のようになります。

サーバー側では、この文字列を取得して long として解析し、Date(long date) コンストラクターで将来使用できるようにします。

新しい Date(long date) は、日付が unixtime であることを期待しています。UNIXtime は、date.getTime() を呼び出すと得られるものです。Unixtime はミリ秒 sins 01.01.1970 00:00:00:0000 です。

サーバーが何らかの種類の解析例外をスローすることを期待しています。

SimpleDateFormat を使用して送信側をフォーマットし、受信側で SimpleDateFormat 解析を使用するかどうかを決定する必要があります。またはunixtimeを送ってください。

unixtimeを送ることをお勧めします。次の方法で Date オブジェクトから変換します。

Long unixtime =  date.getTime() 

帰ってきた:

Date date = new Date(unixtime)

またはサーバー側では、日付オブジェクトはまったく必要ありません。それを使用して getTime() 魔女を呼び出すだけで、unixtime が返されます。

サーバ:

public class Server implements Runnable{
    private int port;
    private String name;
    private Date mydate = new Date();
    private Date date;
    public Server(int port, String name){
        this.port=port;
        this.name=name;
    }
    public synchronized void run(){
        while(true){
        try{

            method();

        }
        catch(Exception e){
            return;
        }

        }
    }

    public synchronized void method() throws Exception{
        long unixtime;
        long average=0;
        String[] values = new String[10];

        ServerSocket server = new ServerSocket(port);

      Socket s=server.accept();

      InputStream in= s.getInputStream();
      OutputStream out = s.getOutputStream();

      PrintWriter w = new PrintWriter(out);
      Scanner r = new Scanner(in);
      for(int i=0; i<10; i++){
      String msg = r.next();
      values[i] = msg;

    }
      for(int j=0; j<values.length; j++){
          unixtime= Long.parseLong(values[j]);
          average = average + unixtime;
      }
      average = (average - mydate.getTime())/2;
      mydate.setTime(average);
      System.out.println(name+": "+mydate.toString());
}
}

クライアント:

public class Client implements Runnable{
    private int port;
    private int id;
    Date time = new Date();
    Date time2 = new Date();
    public Client(int port,int id){
        this.port=port;
        this.id = id;
    }

    public synchronized void run(){

        try{
            Thread.sleep(5000);

            method();

        }
        catch(Exception e){
            return;
        }

    }

    public synchronized void method() throws Exception{
        Random ran = new Random(500);
        int d = ran.nextInt(500)+500;
        time.setTime(time.getTime()+d);
        Socket s = new Socket("localhost", port);

        InputStream in= s.getInputStream();
        OutputStream out = s.getOutputStream();

        PrintWriter w = new PrintWriter(out);
        Scanner r = new Scanner(in);
        for(int i=0; i<10; i++){
        time.setTime(time.getTime()+d);
        w.println(time.getTime());
        w.flush();
        }


    }
}
于 2013-05-04T15:22:31.217 に答える