-1

重複の可能性:
Java タイマーとソケットの問題

これがコードです。私がやりたいことは、時々送信するサーバーからメッセージを取得するための、サーバーとのクライアントループです。これはタイマーでの試みです。

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();
                }



    }
}

しかし、実行すると、プログラムは私のアクションに反応しなくなります。テキストを書くことも、ボタンを押すこともできません。

4

2 に答える 2

1

BufferedReader への読み取り呼び出しがブロックされています。別のスレッド、できればスイング ワーカーで実行してください。あなたのreadLine()呼び出しが原因でメイン イベント スレッドがハングしています。これは、他のイベントが伝達されていないことを意味します。

これを確認するには、TimerActionListener を中断し、実行中のスレッド スタックまたは単に SIGQUIT とスレッド ダンプを調査します。read 呼び出しによってどのスレッドがブロックされているかは明確です。

于 2012-05-14T18:37:12.763 に答える
0

InputStream からデータを取得するまで、br.readline() 呼び出しがブロックされると思います。読み取るソケットに何も来ていない場合、コードはそこでハングします。

こちらのスレッドを参照してください: Asynchronous IO in Java?

于 2012-05-14T18:43:29.840 に答える