как мне сделать диспетчер сокетов для графического интерфейса Swing?

Сейчас у меня есть консольный клиент, который взаимодействует с сервером через ObjectInputStream.readObject() и ObjectOutputStream.writeObject(). Для консольного приложения это работает как есть.

Проблема в том, что класс, который имеет потоки ввода/вывода, также имеет ссылку на объект System.console()!

Как я могу реорганизовать этот класс, чтобы он стал более обобщенным? Я почти хотел бы рассматривать соединение как утилиту или, возможно, как bean-компонент, который затем будет передан в, например, в графический интерфейс Swing или, возможно, в системную консоль.

package net.bounceme.dur.client;

import net.bounceme.dur.data.Title;
import java.net.*;
import java.io.*;
import java.util.Arrays;
import java.util.logging.Logger;
import net.bounceme.dur.data.State;

public class Client {

    private static final Logger log = Logger.getLogger(Client.class.getName());
    private String server = "localhost";
    private int portNumber = 8080;
    private final Console c = System.console();

    private Client() {
    }

    public Client(String server, int portNumber) {
        this.server = server;
        this.portNumber = portNumber;
    }

    public void inputOutput() throws IOException, ClassNotFoundException {
        Socket socket = new Socket(server, portNumber);
        boolean eof = false;
        Title title = null;
        State state = State.undefined;
        try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
                ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream())) {
            do {
                try {
                    title = (Title) objectInputStream.readObject();
                    log.info(title.toString());
                    do {
                        state = State.undefined;
                        try {
                            c.printf("enter the state for record:");
                            state = State.valueOf(c.readLine());
                        } catch (java.lang.IllegalArgumentException iae) {
                            log.warning(Arrays.deepToString(State.values()));
                        }
                    } while (state == State.undefined);
                    title.setState(state);
                    title.setTitle("modified from client");
                    objectOutputStream.writeObject(title);
                } catch (java.io.EOFException eofe) {
                    eof = true;
                }
            } while (!eof);
        }
    }

}

смотрите также:

Java — сокеты и Swing


person Thufir    schedule 09.07.2014    source источник
comment
Почитайте немного о шаблоне Производитель/Потребитель. Вместо записи в Console вы должны либо создавать события, либо записывать содержимое в какую-то очередь, которая может быть прочитана заинтересованными сторонами, например   -  person MadProgrammer    schedule 09.07.2014
comment
Вы также можете изучить концепцию программирования интерфейса, например   -  person MadProgrammer    schedule 09.07.2014
comment
Этот вопрос может быть более подходящим для сайта Code Review Stack Exchange.   -  person APerson    schedule 09.07.2014
comment
см. также stackoverflow.com/a/8301236/262852   -  person Thufir    schedule 09.07.2014