客户端停止响应服务器的消息

时间:2012-05-15 19:11:51

标签: java swing sockets concurrency timer

我遇到了一个新问题。 我在Java + Swing中编写了一个使者,我选择了这种方式与客户端进行客户端对话:

我有类Running(所有代码都是针对客户端的) (服务器还可以 - 我查了一下)

public class Running {
private Socket s;
private PrintStream ps;
private BufferedReader br;

public Running(){
try{
    s = new Socket(InetAddress.getLocalHost(), 8072);
    ps = new PrintStream(s.getOutputStream());
    br = new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (UnknownHostException ex) {
    System.out.println("11");
    ex.printStackTrace();
} catch (IOException ex) {
    System.out.println("00");
    ex.printStackTrace();
}
}

public String receiveLine(){
    String ret = "";
    try {
        ret = br.readLine();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return ret;
}

public void sendLine(String s){
    ps.println(s);
}

public void close(){
    try {
        s.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

主要是我做一个变量

  run = new Running();

然后我将这个变量发送到处,它似乎有效。 它提供readline或writeline throwgh套接字。 我可以注册用户,登录或添加联系人。

我可以打开一个MessageFrame来向我的联系人发送消息。 但是当我关闭它时,我的程序会停止对服务器消息的正确反应。 它只对30-70%的消息做出反应。 我查了一下 - 服务器还行。 所以问题出在Running或MessageFrameListener

public class MessageFrameListener{
private MessageFrame mf;
private User us;
private Contact cn;
private Timer timer;
private Running run;

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


public class timerListener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
                SwingWorker<String,Void> sw = new SwingWorker<String,Void>(){
                    public String doInBackground() {
                        String ret = "";
                        ret = run.receiveLine();
                        return ret;
                    }
                    public void done() {
                        String[] results = null;

                            try {
                                results = get().split(" ");
                            } catch (InterruptedException
                                    | ExecutionException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }


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


                    }
                };
                sw.execute();
    }
}

public class SButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
            String insert = mf.getInput();
            if(!insert.equals("")){
                String infoString = "m "+us.getName()+" "+cn.getName()+" "+insert;
                run.sendLine(infoString);
                mf.addLine(insert);
                mf.refreshInput();
            }
    }
}


public class FrameListener implements WindowListener{

    @Override
    public void windowClosing(WindowEvent e) {
        timer.stop();
        timer = null;
        mf.close();
    }

新信息! 我开始调试了。我的客户端从服务器获取消息并进入此行

   mf.addLine2(results[3]);

但是没有任何反应! Swing不会添加新行。

addLine2的代码:

  public void addLine2(String line){
    //dialogArea.append(line+"\n");

    try { 
        if(line != ""){
            String formLine = us.getName()+" ("+now()+")\n";
            doc.insertString(doc.getLength(), formLine+line+"\n",st2);
        }

    }   
    catch (BadLocationException e){
        e.printStackTrace();
    }

}

当然是行!=“”; 可能是线程的一些Swing问题?而Swing无法处理我的请求?

瓦西。

3 个答案:

答案 0 :(得分:2)

我觉得问题出在这一行,你的PrintStream没有设置为自动刷新,因此尝试改变这一行:

ps = new PrintStream(s.getOutputStream());

到这个

ps = new PrintStream(s.getOutputStream(), true);

所以不是将输入存储到缓冲区,而是将其自动刷新。有关详细信息PrintStream(OutputStream out, boolean autoFlush)

答案 1 :(得分:1)

可能是因为readLine方法期望该行以\ n结束。尝试让服务器发送消息并在其末尾添加\ n

答案 2 :(得分:1)

嘿,他说的是对的,那个字符串将用/ n但它正试图获取。

in that just try with  **While** condition , that till true get the string .

以下是样本

try {
        while(true) {

            DataInputStream is = new                      DataInputStream(sock.getInputStream());
          System.out.println("" +is.readLine());

            line =is.readLine();

        } // end of while
    } catch(Exception ex) {}
}