2016-03-01 47 views
2

我想创建一个服务器,该服务器应该接受2个输入时间(每个项目),并在达到项目的截止日期时显示。使用日历设置2个项目的截止日期并验证日期?


这里的程序应该做的:

  • 询问截止时间为第1项
  • 设定的期限为1项
  • 询问截止时间为2项
  • 设置项目2的截止日期
  • 运行服务器,检查未达到截止日期。如果到达,则在控制台中显示相应的消息,以说明已达到哪个截止日期(哪个项目)。

我很努力的能够用我的代码实现这一点。


这就是我现在所拥有的:

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class MultiEchoServer 
{ 

    public static void main(String[] args) throws IOException 
    { 
     Calendar start = Calendar.getInstance(); 
     int date = start.get(Calendar.DATE); 
     int month = start.get(Calendar.MONTH); 
     int year = start.get(Calendar.YEAR); 
     Scanner input = new Scanner(System.in); 

     ServerSocket serverSocket = null; 
     final int PORT = 1234; 
     Socket client; 
     ClientHandler handler; 

     try 
     { 
      serverSocket = new ServerSocket(PORT); 
     } 
     catch (IOException ioEx) 
     { 
      System.out.println("\nUnable to set up port!"); 
      System.exit(1); 
     } 

     System.out.println("\nServer running...\n"); 

     System.out.print("Enter finishing time for item 1 in 24-hr format "); // Item 1 
     System.out.print("(e.g. 17:52) : "); 
     String timeString = input.nextLine(); 

     String hourString = timeString.substring(0,2); 
     int hour = Integer.parseInt(hourString); 

     //Extract minutes from user's entry... 
     String minString = timeString.substring(3,5); 
     int minute = Integer.parseInt(minString); 

     //Set up Calendar object to hold deadline time... 
     Calendar deadline = Calendar.getInstance(); 

     //Put current date (retrieved from 'start' Calendar object) and time (entered by user) into above 
     //Calendar object... 
     deadline.set(year,month,date,hour,minute,0); 
     //(Last argument above specifies seconds.) 

     System.out.println("\n\nDeadline: " + getDateTime(deadline) + "\n"); 

     System.out.print("Enter finishing time for item 2 in 24-hr format "); // Item 2 
     System.out.print("(e.g. 17:52) : "); 
     String timeString2 = input.nextLine(); 

     String hourString2 = timeString2.substring(0,2); 
     int hour2 = Integer.parseInt(hourString2); 

     //Extract minutes from user's entry... 
     String minString2 = timeString2.substring(3,5); 
     int minute2 = Integer.parseInt(minString2); 

     //Set up Calendar object to hold deadline time... 
     Calendar deadline2 = Calendar.getInstance(); 

     //Put current date (retrieved from 'start' Calendar object) and time (entered by user) into above 
     //Calendar object... 
     deadline2.set(year,month,date,hour2,minute2,0); 
     //(Last argument above specifies seconds.) 

     System.out.println("\n\nDeadline: " + getDateTime(deadline2) + "\n"); 

     //Retrieve current date and time... 
     Calendar now = Calendar.getInstance(); 



     while(now.before(deadline) || now.before(deadline2)) 
     { 
      //System.out.println(getDateTime(now)); 

      //Pause to prevent dates and times from 
      //scrolling off screen too quickly... 
      try 
      { 
       Thread.sleep(2000); 
      } 
      catch (InterruptedException intEx) 
      { 
       //Do nothing. 
      } 

      //Update current date and time... 
      now = Calendar.getInstance(); 
     } 

     System.out.println("\n\nDeadline reached!!!\n"); 

     do 
     { 
      //Wait for client. 
      client = serverSocket.accept(); 

      System.out.println("\nNew client accepted.\n"); 
      handler = new ClientHandler(client); 
      handler.start(); 
     }while (true); 

    } 

    public static String getDateTime(Calendar dateTime) 
    { 
     //Extract hours and minutes, each with 2 digits 
     //(i.e., with leading zeroes if needed)... 

     String hour2Digits = String.format("%02d", dateTime.get(Calendar.HOUR_OF_DAY)); 
     String min2Digits = String.format("%02d", dateTime.get(Calendar.MINUTE)); 

     return(dateTime.get(Calendar.DATE) 
       + "/" + (dateTime.get(Calendar.MONTH)+1) 
       + "/" + dateTime.get(Calendar.YEAR) 
       + " "+ hour2Digits + ":" + min2Digits); 
    } 
} 


class ClientHandler extends Thread 
{ 
    private Socket client; 
    private Scanner input; 
    private PrintWriter output; 

    public ClientHandler(Socket socket) throws IOException 
    { 
     client = socket; 

     input = new Scanner(client.getInputStream()); 
     output = new PrintWriter(client.getOutputStream(),true); 
    } 

    public void run() 
    { 
     String received; 

     received = input.nextLine(); 
     while (!received.equals("QUIT")) 
     { 
      output.println("ECHO: " + received); 
      received = input.nextLine(); 
     } 

     try 
     { 
      System.out.println("Closing down connection..."); 
      client.close(); 
     } 
     catch(IOException ioEx) 
     { 
      System.out.println("* Disconnection problem! *"); 
     } 
    } 
} 

有没有设定截止日期为每个项目并检查是否最后期限已达到更有效的方法是什么?为Item创建班级会是一个好主意吗?我将如何实现这一点?

回答

0

服务器端的设计似乎存在不一致。比较Calendar对象的逻辑理想情况应该在ClientHandler线程中,而不是在main方法中。否则,对于ClientHandler将没有任何意义(它在代码中写入的方式除了创建客户端套接字然后关闭它之外什么都不做)。

关于逻辑本身,如果您仅限于使用Calendar API,那么您可以做的很少,以减少冗长。但是,当您将当前时间与截止日期进行比较时,您的代码不会考虑日,月和年。

如果这是所期望的,即服务器基本上假定截止日期是在同一天,那么您不需要在创建的日历对象中设置日期。只设置小时和分钟:

deadline.set(Calendar.HOUR, hour); 
deadline.set(Calendar.MINUTE, minute); 

您可能还想包括秒更加精确。

如果您使用的是Java 8,则可以OffsetTime信手拈来的几个原因:

  • 它代表了时间(无需指定日期)。
  • 它包含一个偏移量,表示您的客户端和服务器位于不同时区的时区。
  • 它是线程安全的。

您可以使用输入的字符串,如下所示创建一个对象:

OffsetTime deadline = OffsetTime.parse("10:15:30+01:00"); 

而且你可以比较使用方法isBefore其他时间的对象。

如果应该考虑日期,那么您可以使用OffsetDateTime