SwingWorker и извлечение данных из сокета - PullRequest
0 голосов
/ 27 января 2012

У меня есть такой код

try {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(888);
        } catch (IOException e) {}

        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {}

        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String inputLine, outputLine;

        while ((inputLine = in.readLine()) != null) {
            outputLine = "SRV:>"+inputLine+"<:VRS";
            out.println(outputLine);
            taWyjscie.append(outputLine+"\n");
            if (inputLine.equals("Bye."))
                break;
        }

        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close(); 

    } catch (IOException ex) {
        taWyjscie.append("Błąd I/O: "+ex.getLocalizedMessage() + "\n");
    }

Работает, но приложение не работает, пока клиент не отправит «Пока».

Я хочу иметь возможность отправлять сообщения клиенту с сервера через графический интерфейс, так что я борюсь с SwingWorker, я получил это:

try {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(888);
        } catch (IOException e) {}

        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {}

        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String inputLine, outputLine;

        zadanie = new ServerTask(in);

    } catch (IOException ex) {
        taWyjscie.append("Błąd I/O: "+ex.getLocalizedMessage() + "\n");
    }

 private class ServerTask extends SwingWorker<String, String> {
    private BufferedReader iin;

    public ServerTask(BufferedReader win) {
        this.iin = win;
    }


    @Override
    protected String doInBackground() throws Exception {
        String input;
        while ((input = iin.readLine()) != null) {
            System.out.println(input);
            publish(input);
            if (isCancelled())
                break;
        }
        return null;
    }
    @Override
    protected void process(List<String> chunks) {
        for(String el : chunks) {
            textAreaOUT.append(el+"\n");
        }
    }

}

Теперь я не могу отправить сообщение с сервера на клиент, но сообщения от клиента не отображаются в textArea. Я борюсь с самого утра, и я не могу понять, как работает работник свинга ...

PS. эта попытка ... поймать впереди в функции, выполняемой кнопкой (если она отличается)

1 Ответ

2 голосов
/ 27 января 2012

Вы никогда не звоните execute на вашем SwingWorker, это ваш первый баг. Начни там ..

...