所以这是代码。 我想做的是 - 与服务器的客户端循环,从服务器获取消息,有时发送它们。 这是计时器的尝试。
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();
}
}
}
但是当我运行它时 - 程序停止对我的行为作出反应。 我无法写文字或按下按钮。
答案 0 :(得分:1)
对BufferedReader的读取调用正在阻塞,在一个单独的线程中运行它们,最好是一个swing工作者。您的readLine()
调用导致主事件线程挂起,这意味着没有其他事件正在传播。
要确认这一点,请在TimerActionListener中放置一个中断并调查正在运行的线程堆栈或仅调用SIGQUIT和线程转储。应该很清楚读取调用导致阻塞的线程。
答案 1 :(得分:0)
我相信你的br.readline()调用会阻塞,直到你从InputStream获取数据。如果没有任何东西通过套接字读取,代码将挂在那里。
您可能希望在此处看到该主题:Asynchronous IO in Java?