Гнездо внутри плагина bukkit закрывается после использования - PullRequest
0 голосов
/ 04 сентября 2018

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

Main:

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();
        }
    }

}

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

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

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 загружается не полностью, пока к этому сокету не был сделан один запрос. Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 04 сентября 2018

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

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

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

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

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

...