Веб-интерфейс для tcp / ip socketserver

Итак, я закончил разработку низкоуровневого TCP-сервера на Java с использованием управляемых потоков и серверных сокетов. Он работает как стандартный .jar, прослушивает и обрабатывает входящие соединения, которые он получает на ServerSocket, и отправляет все, что получает, на другой сервер через Socket.

Теперь я пытаюсь добавить веб-интерфейс, который будет обрабатывать базовые вещи, такие как изменение адреса внешнего сервера, запуск / остановка сервера, информация о том, когда он работает, что подключено и т. д.

Я хотел избежать настройки всего приложения Tomcat, полностью отделенного от Java-сервера, поскольку им нужно было бы совместно использовать базу данных. Итак, я искал возможность конвертировать все в Jetty, но не похоже, что это лучший вариант.

Есть ли лучшие варианты для HTML-библиотек, которые подошли бы для управления Java-приложением? Или лучше переместить мой SocketServer в полноценное веб-приложение, обслуживаемое Tomcat, или что-то в этом роде? Если последнее, есть ли способ запустить SocketServer при запуске веб-приложения и убедиться, что оно продолжает работать? Или лучше просто использовать встроенный HTTP-сервер в моем уже готовом Java-приложении? Если это возможно, то можно ли отображать динамические данные или изменять поля в SocketServer

Обновлено:

Мне все еще не удалось заставить этот дизайн работать, но я хотел прояснить мой текущий дизайн и мои потребности.

В настоящее время у меня есть консольное приложение, в котором Main.java считывает данные из файла конфигурации и создает объект MyServer.java. Этот Сервер создает проект SocketServer, включающий управляемые потоки.

Создается поток слушателя, который открывает SocketServer, и любые входящие соединения порождают рабочий поток, который непрерывно считывает данные. Все соединения остаются открытыми до тех пор, пока соединение не будет считано. Он делает это, принимая Socket, полученный от sSocket.accept (), и сохраняет его в HashMap путем обратного вызова MyServer.java.

В дополнение к этому он создает еще один сокет для другого сервера, используя обычный сокет, и таким же образом считывает данные. Все сообщения, полученные от любого из сокетов, помещаются в очередь.

Когда что-то есть в очереди, другой поток в Server.java записывает каждый элемент в очереди во все открытые сокеты.

public class MyServer {
    private ConcurrentHashMap<String, ISpeaker> mEndpointMap;
    private Queue<String> mOutputQueue;
    private ICallback mCallback = new ICallback() {
        public void putEndpoint(URI uri, ISpeaker speaker);
        public void removeEndpoint(URI uri);
        public void pushMessage(String message);
    }

    private Thread mClientThread;
    private Thread mListeningThread = new Thread() {
        public void run() {
            while(true) {
                ServerSocket sSocket = new ServerSocket(getPort());
                Socket socket = sSocket.accept();
                socket.setSoTimeout(0);
                TcpWorkerThread workerThread = new TcpWorkerThread(socket);
                workerThread.start();
            }
        }

        class TcpWorkerThread extends Thread {
            private Socket mSocket;
            public void run() {
                try(InputStreamReader sr = new InputStreamReader(socket.getInputStream())) {
                    String content = "";
                    int read;
                    mServerCallback.putEndpoint(getUri(), new TcpStreaming(socket.getOutputStream());
                    while((read = sr.read(buffer, 0, buffer.length)) != 1) {
                         //READ & DO STUFF
                    }
                    mServerCallback.removeEndpoint(getUri()); //read has failed, remove from output map
                }
            }
        }
    }
    private Thread mSpeakerThread = new Thread() {
        public void run() {
            while(true) {
                if(mOutputQueue.size() > 0) {
                    for(ISpeaker speaker : mEndpointMap.values()) {
                        speaker.write(mOutputQueue.poll()));
                    }
            }
        }
    };

    public void StartServer() {
        mListeningThread.start();
        mClientThread.start();
        mSpaeakerThread.start();
}

Реализация интерфейса

public class TcpStreaming implements ISpeaker {
    private final OutputStreamWriter os;
    private final URI uri;

    public TcpStreaming(URi endpoint, OutputStreamWriter os) {
        this.uri = endpoint;
        this.os = os;
    }

    public void write(String message) {
        os.write(message);
        os.flush();
    }
}

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

Так что это можно сделать просто, например, добавив встроенный веб-сервер, который может обслуживать HTML / JSP, или, возможно, перенести эту кодовую базу в контейнер Tomcat. Или это вообще невозможно с этим дизайном? Можно ли отремонтировать его, сделав его только веб-службой? Если да, могу ли я поддерживать соединения и обрабатывать их так же, как сейчас?

Обновлено:

Итак, моя текущая идея, над которой я в основном работаю, - запустить RESTful Http Server с использованием apache.http.HttpServer с HttpRequestHandlers.

Я извлекаю данные из части приложения SocketServer, используя интерфейс обратного вызова. Написание HTML-страниц и их сортировка в месте компиляции и загрузка их в строку в HttpRequestHandler.

public class MainPageHandler implements HttpRequestHandler {
    private static final String fServerKey = "{$ServerAddress}";
    private static final String fConnectionTableKey = "{$ConnectionTable}";
    private final IServerCallback mCallback;

    public MainPageHandler(IServerCallback callback) {
        this.mCallback = callback;
    }

    @Override
    public void handle(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException {
        File file = new File(System.getProperty("user.dir") + "/Router/src/rest/handler/view/index.html");
        FileInputStream fis = new FileInputStream(file);
        byte[] data = new byte[(int) file.length()];
        fis.read(data);
        fis.close();
        String page = new String(data);

        httpResponse.setEntity(new StringEntity(page, ContentType.TEXT_HTML));

    }
}

Я использую теги в HTML, чтобы заменить его данными после загрузки строки, чтобы получить динамические / живые данные. Такие функции, как включение / выключение сервера, также достигаются с помощью HttpHandlers, которые перенаправляют на страницу, которая что-то отображает.

Сейчас он работает, но, честно говоря, даже мне это кажется смешным. Я надеялся, что это будет лучшее решение. Дайте мне знать, если у кого-нибудь есть идеи.

Я написал класс ServerSocketEx несколько лет назад, который обрабатывает большую часть сантехники для создания ServerSockets. Если вам интересно, он находится здесь, на SourceForge: sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/…

ControlAltDel 10.08.2018 16:11

Я ценю это, я посмотрю, можно ли улучшить мою собственную кодовую базу. Но у меня действительно есть код ServerSocket, и я добавляю слой HTML поверх него (или, возможно, переношу его в веб-приложение)

CovaDax 10.08.2018 16:15
0
2
291
0

Другие вопросы по теме