Разъем внутри плагина bukkit закрывается после использования

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

Основной:

public class Main extends JavaPlugin {

    public void onEnable() {
        saveDefaultConfig();
        getConfig().options().copyDefaults(true);

        System.out.println("[INFO] Main class loaded.");

        start();


    }

    public void start() {
        SocketServer server = new SocketServer();
        try {
            server.start(getConfig().getInt("port"), getConfig().getString("socket-password"));
            System.out.println("[INFO] Main successfully called start.");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Класс сокет-сервера:

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

public class SocketServer {

    private ServerSocket serverSocket;
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    public void start(int port, String socketpwd) throws IOException {
        System.out.println("[INFO] Socket server listening on: " + port);

        serverSocket = new ServerSocket(port);
        clientSocket = serverSocket.accept();
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        Boolean enabled = true;

        try {
        // Socket authentication
        String message = in.readLine();
        String suffix[] = message.split(" ");
        System.out.println("Socket auth code used: "+ suffix[0]);
        System.out.println("Socket pwd is: " + socketpwd);

            if (socketpwd.equals(suffix[0])) {
                out.println("Auth sucessfull!");
                // do the following command from args here

                String command = suffix[1];
                int suffixL = suffix.length;

                // add arguments to command

                for (int i = 2; i < suffixL; i++) {
                    command = command + " " + suffix[i];
                }

                // call req exec

                System.out.println("[INFO] Socket server contacted Request executor with: " + command);
                RequestExecutor.executor(command);

                enabled = false;

            }
            else {
                out.println("Unrecognised auth code!");
            }
        } catch (NullPointerException e) {
            System.out.println("Exception prevented!");
        }

    }

    public void stop() throws IOException {
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }

}

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, вы не должны запускать такой сокет в основном потоке, обычно вы должны запускать его в асинхронной задаче с использованием планировщика Bukkit.

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

Вы хотите делать что-то подобное

while(true){
    Socket socket = serverSocket.accept();
}

См. эта веб-страница для получения дополнительной информации.

Хорошо, но как мне запустить его асинхронно, я не могу найти достаточно хороший пример

ThisIsEcho 04.09.2018 15:31

Попробуйте заглянуть в BukkitRunnable

LeoColman 04.09.2018 15:47

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