input.read () func.заблокировать в то время как цикл - PullRequest
1 голос
/ 18 августа 2011

После подключения к серверу я запускаю некоторые команды на сервере и затем пытаюсь перенести знания о сервере в консоль;

while(i!=-1){
                String c="";
                String line = "";

                    try {
                        while ((i = input.read()) != 10 && i!=-1) {
                            bx[0] = (byte) i;
                            c = new String(bx);
                            line = line + c ;
                            System.out.print(c);
                        }
                    } catch (IOException e2) {
                        e2.printStackTrace();
                    }   
                    File outfile = new File("calltrak.txt");
                    boolean append = true;
                    try
                    {
                        if (!outfile.exists())
                        {
                            append = false;
                        }
                        FileWriter fout1 = new FileWriter("calltrak.txt",append);
                        PrintWriter fileout = new PrintWriter(fout1,true);
                        fileout.println(line);
                        fileout.flush();
                        fileout.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    disp.append(line);
            }

Но проблема в том, что когда программа читает все строки из окна сервера, на сервере она ожидает нового ввода, и моя прога все еще пытается прочитать строку, и поэтому она заблокирована ... Как я могу решить эту проблему ... ( Примечание: использование таймера не является способом решения, потому что строки, которые программа читает, могут быть 100 строк или 100000, а иногда и сервер может работать медленно) (в коде «disp» имя Jpanel)

Ответы [ 2 ]

1 голос
/ 24 августа 2011

Я решил эту проблему с помощью нити paralel. Запустив метод чтения Inputstream, я также запустил другой поток и поместил в него таймер. Если метод чтения подождет более 5 секунд, другой поток отправит -1 в первый цикл и цикл завершится.

0 голосов
/ 18 августа 2011

Есть несколько проблем с производительностью в вашем коде, но чтобы ответить на ваш вопрос, вы должны позволить серверу отправить EndOfText 0x3 или EndOfTransmission 0x4 в конце, см. AsciiTable таким образом, вы можете прекратить тогда.

...