Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 客户端停止对服务器的响应';s消息_Java_Swing_Sockets_Concurrency_Timer - Fatal编程技术网

Java 客户端停止对服务器的响应';s消息

Java 客户端停止对服务器的响应';s消息,java,swing,sockets,concurrency,timer,Java,Swing,Sockets,Concurrency,Timer,我面临一个新问题。 我正在用Java+Swing编写一个messenger,我选择了这种方式与服务器进行客户端对话: 我有类正在运行(所有代码都是为客户机编写的) (服务器正常-我已检查) } 主要是我做了一个变量 run = new Running(); 然后我将这个变量发送到所有地方,它似乎都能工作。 它通过插槽提供读线或写线。 我可以注册用户、登录或添加联系人 我可以打开MessageFrame向联系人发送消息。 但当我关闭它时,我的程序会停止对服务器消息的正确反应。 它只对30-7

我面临一个新问题。 我正在用Java+Swing编写一个messenger,我选择了这种方式与服务器进行客户端对话:

我有类正在运行(所有代码都是为客户机编写的) (服务器正常-我已检查)

}

主要是我做了一个变量

  run = new Running();
然后我将这个变量发送到所有地方,它似乎都能工作。 它通过插槽提供读线或写线。 我可以注册用户、登录或添加联系人

我可以打开MessageFrame向联系人发送消息。 但当我关闭它时,我的程序会停止对服务器消息的正确反应。 它只对30-70%的消息作出反应。 我检查了-服务器正常。 因此,问题在于运行或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();
    }
但是什么也没发生!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不能处理我的请求


Vasily.

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

嘿,他说的是对的,该字符串将与/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) {}
}

嘿,他所说的是对的,字符串将与/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) {}
}

在我看来,问题在于这一行,您的PrintStream未设置为自动刷新,因此请尝试更改这一行:

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

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

因此,它不会将输入存储到缓冲区,而是自动将其清除。有关更多信息

在我看来,问题在于这一行,您的PrintStream未设置为自动刷新,因此请尝试更改这一行:

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

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

因此,它不会将输入存储到缓冲区,而是自动将其清除。有关更多信息,请参见服务器发送消息outputStream.println(“某些字符串”);因此,它们似乎以\n结尾,因为printlntry制作了一个带有main的小测试类,如下所示:for(;;)running.receiveLine()如果它不起作用,请查看代码在clientIt中的停止位置它不会有帮助。我可以在第一次打开消息框时发送2或2000条消息,一切正常。但是当我关闭它并再次打开时,我只收到50%的消息。这可能是服务器的问题。如果您无法识别错误,请尝试使用wireshark之类的工具,查看流量是否确实是由服务器发送的,以及消息是否正是您所期望的关于问题的新的有趣信息(来自调试)!查看我的问题服务器发送消息outputStream.println(“一些字符串”);因此,它们似乎以\n结尾,因为printlntry制作了一个带有main的小测试类,如下所示:for(;;)running.receiveLine()如果它不起作用,请查看代码在clientIt中的停止位置它不会有帮助。我可以在第一次打开消息框时发送2或2000条消息,一切正常。但是当我关闭它并再次打开时,我只收到50%的消息。这可能是服务器的问题。如果您无法识别错误,请尝试使用wireshark之类的工具,查看流量是否确实是由服务器发送的,以及消息是否正是您所期望的关于问题的新的有趣信息(来自调试)!请参阅我问题的底部有关该问题的新的有趣信息(来自调试)!请参阅我问题的底部有关该问题的新的有趣信息(来自调试)!查看我问题的底部1)将你的问题拆分为两个三个分开的问题2)在这个论坛上搜索,我可以在这里找到一些关于Swing和Socket以及SwingWorker/Runnable#Thread1)将你的问题拆分为两个三个分开的问题2)在这个论坛上搜索,我可以在这里找到一些关于Swing和Socket以及SwingWorker/Runnable#Thread的非常相互关联的代码