Java +套接字+ Timer =程序挂起

时间:2012-05-14 18:14:02

标签: java sockets timer

  

可能重复:
  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();
                }



    }
}

但是当我运行它时 - 程序停止对我的行为作出反应。 我无法写文字或按下按钮。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

您可能希望在此处看到该主题:Asynchronous IO in Java?