Программирование тревоги через сокет - PullRequest
4 голосов
/ 30 марта 2012

Я сделал цифровые часы в Java через программирование сокетов.

, когда клиент отправляет то же время, что и системный сервер, соответствует времени и воспроизводит сигнал тревоги. Но когда клиент отправляет на 1 или 2 минуты больше, чем серверне сопоставлять время с системным временем и не воспроизводить будильник.

здесь мой код

Сторона сервера:

public class GraphicsServer extends JFrame implements Runnable
{

    String wr;
    String text;
    JTextField f1;
    JTextField f2;
    JScrollPane js;
    JTextArea jt;
    JPanel p;
    Color color;
    Calendar cal;
    String time;
    String time1;
    int hrs;
    int min;
    int sec;

    public GraphicsServer()
    {
        super("Server Tik Tik Tok");
        setSize(400, 400);
        p = new JPanel();
        f1 = new JTextField(10);
        f2 = new JTextField(10);
        p.add(f1);
        p.add(f2);
        add(p);
        Thread thread = new Thread(new Runnable()
        {

            public void run()
            {
                while(true)
                {
                    Calendar now = Calendar.getInstance();
                    int hrs = now.get(Calendar.HOUR_OF_DAY);
                    int min = now.get(Calendar.MINUTE);
                    int sec = now.get(Calendar.SECOND);
                    String time = hrs + ":" + min + ":" + sec;
                    f2.setText(time);
                    time1 = hrs + ":" + min;
                    // System.out.println(time1);
                    // System.out.println(time);
                    try
                    {
                        Thread.sleep(1000);
                    }
                    catch(Exception ee)
                    {
                        System.out.println(ee.getMessage());
                    }
                }
            }
        });
        thread.start();
    }

    public void run()
    {
        try
        {
            ServerSocket server = new ServerSocket(1111);
            while(true)
            {
                Socket ss = server.accept();
                BufferedReader br = new BufferedReader(new InputStreamReader(ss.getInputStream()));
                text = br.readLine();
                f1.setText(text);
                wr = time1;
                if(text.endsWith(wr))
                {
                    color = JColorChooser.showDialog(GraphicsServer.this, "Choose a color", color);
                    p.setBackground(color);
                }
            }
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }

    public static void main(String[] args)
    {
        GraphicsServer gs = new GraphicsServer();
        gs.setVisible(true);
        Thread th = new Thread(gs);
        th.start();
    }
}

КлиентСторона:

public class GrapClient extends JFrame
{

    JButton b1;
    JTextField f1;
    Socket client;

    public GrapClient()
    {
        super("Client Tik Tik Tok");
        setSize(400, 400);
        JPanel p = new JPanel();
        b1 = new JButton("Enter Alarm Time");
        f1 = new JTextField(10);
        p.add(b1);
        p.add(f1);
        add(p);
        ActionListener newListener = new ActionListener()
        {

            public void actionPerformed(ActionEvent event)
            {
                try
                {
                    Socket client = new Socket("localhost", 1111);
                    PrintStream ps = new PrintStream(client.getOutputStream());
                    String g = f1.getText();
                    ps.println(g);
                    f1.setText("");
                }
                catch(Exception e)
                {
                    System.out.println(e.getMessage());
                }
            }
        };
        b1.addActionListener(newListener);
    }

    public static void main(String[] args)
    {
        GrapClient GC = new GrapClient();
        GC.setVisible(true);
        GC.setResizable(false);
    }
}

Я хочу сделать будильник. Внутри сервера я встраиваю цифровые часы в текстовое поле. Когда клиент отправляет время будильника на сервер, сервер сравнивает время будильника клиента сэто время на цифровых часах.если время на стороне сервера равно 23: 10. и клиент отправляет на сервер в то же время 23:10, сервер покажет выбор файла jfile.если у сервера есть время 23:10 и клиент отправляет время тревоги 23: 11. когда время сервера равно времени тревоги клиента через 1 минуту, тогда сервер откроет jfilechoser.

1 Ответ

1 голос
/ 31 марта 2012

ОК, есть несколько проблем с этим кодом

  1. Вы получаете доступ к множеству полей из разных экземпляров Thread без каких-либо шагов синхронизации.Это может привести к странным ошибкам, связанным с многопоточностью
  2. У вас нет доступа к компонентам Swing в потоке отправки событий .Это может быть хорошей идеей, чтобы прочитать о Swing Concurrency
  3. Пожалуйста, начните использовать приличные имена переменных, которые облегчили бы чтение вашего кода

Однако ни один из этих пунктов не является реальной проблемой.Проблема в том, что вы, вероятно, думаете, что ваш (и да, я переименовал некоторые переменные)

  while ( true ) {
    Socket ss = server.accept();
    BufferedReader br = new BufferedReader( new InputStreamReader( ss.getInputStream() ) );
    String alarmTimeFromSocket = br.readLine();
    alarmTimeTextField.setText( alarmTimeFromSocket );
    if ( alarmTimeFromSocket.endsWith( currentTime ) ) {
      color = JColorChooser.showDialog( GraphicsServer.this, "Choose a color", color );
      contentPane.setBackground( color );
    }
  }

работает постоянно, что не так.Вызов br.readLine() является блокирующим вызовом.Следовательно, Thread постоянно ожидает ввода.Как только он получает новое время будильника, он немедленно выполняет следующий фрагмент кода (сравнение), а затем снова начинает ждать ввода.

Таким образом, твой код сравнения выполняется только в тот момент, когда ты установил время будильника,и не постоянно, когда время обновляется.

Кроме того, я думаю, что endsWith неверно (или вы не можете установить время, включая секунды от клиента, в этом случае оно будет работать, но тогда вы могли бы легкоиспользуйте equals вместо endsWith)

Возможным решением вашей проблемы является сравнение времени будильника и текущего времени стены в цикле, которое обновляет время стены на стороне сервера.Но опять же, вы можете покончить со странными проблемами с потоками, если другой Thread обновит поле времени будильника в тот же момент, когда вы сравните его со временем стены в wall-time-updater- Thread

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...