【问题标题】:Java + Sockets + Timer = program hangs [duplicate]Java + Sockets + Timer =程序挂起[重复]
【发布时间】:2012-05-14 18:14:02
【问题描述】:

可能重复:
java timer and socket problem

所以这里是代码。 我想要做的 - 是与服务器的客户端循环,以从服务器获取消息,有时会发送它们。 这是定时器的尝试。

private MessageFrame mf;
private User us;
private Contact cn;

private Socket s;
private PrintStream ps;
private BufferedReader br;

private Timer timer ;

public MessageFrameListener(MessageFrame m_f, User u_s, Contact c_n){
    timer = new Timer(500,new timerListener());
    mf = m_f;
    us = u_s;
    cn = c_n;
    m_f.addButtonListener(new SButtonListener());
    m_f.addWinListener(new FrameListener());

}

public void init(){
    try {
        s = new Socket(InetAddress.getLocalHost(), 8072);
        ps = new PrintStream(s.getOutputStream());
        br = new BufferedReader(    new InputStreamReader(s.getInputStream()));
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    timer.start();      

}

public class timerListener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
            //String insert = mf.getInput();

                String result;
                try {
                    //проверить, что буфер не пуст
                    if((result = br.readLine()) != null){


                    String[] results = result.split(" ");
                    if("m".equals(results[0])){
                        if("-1".equals(results[2]))
                            mf.addLine2("Error");
                        else{
                            mf.addLine2(results[3]);
                        }
                    }
                    }

                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }



    }
}

但是当我运行它时 - 程序停止对我的行为做出反应。 我不能写文字,也不能按下按钮。

【问题讨论】:

  • 您可能正在事件调度线程 (EDT) 上运行您的套接字,您可能应该将其移至 SwingWorker
  • @GuillaumePolet 这应该是一个答案。考虑到这是正确的答案。
  • 这是关于 SO 的每三十个问题中就有一个具有完全相同的解决方案:)
  • @trutheality 我没有足够的信息来做出肯定和回答。所以我想我可以让 OP 朝着好的方向发展。我想我今天早上刚刚发布了一个用 Socket 冻结 GUI 的答案。所以从那里开始,如果这是他的问题,他应该找到自己的方式。
  • //проверить, что буфер не пуст 请用英文编码 cmets。谷歌翻译告诉我这意味着“检查缓冲区不为空”。 (如果不确定翻译,您可以在发布之前使用翻译服务。)

标签: java sockets timer


【解决方案1】:

对 BufferedReader 的读取调用是阻塞的,最好在一个单独的线程中运行它们,最好是一个 swing worker。您的 readLine() 调用导致主事件线程挂起,这意味着没有其他事件正在传播。

要确认这一点,请中断 TimerActionListener 并调查正在运行的线程堆栈或仅 SIGQUIT 和线程转储。应该很清楚 read 调用导致哪个线程阻塞。

【讨论】:

    【解决方案2】:

    我相信您的 br.readline() 调用会阻塞,直到您从 InputStream 获取数据。如果没有任何东西通过套接字读取,则代码将挂在那里。

    您可能想在这里查看帖子:Asynchronous IO in Java?

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 2013-07-19
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多