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




Прежде всего, вы не должны запускать такой сокет в основном потоке, обычно вы должны запускать его в асинхронной задаче с использованием планировщика Bukkit.
Затем, как только вы откроете сокет, вы должны создать цикл while для непрерывного опроса соединения и обработки входящих данных. Вместо этого вы открываете сокет, читаете строку и затем разрываете соединение.
Вы хотите делать что-то подобное
while(true){
Socket socket = serverSocket.accept();
}
См. эта веб-страница для получения дополнительной информации.
Попробуйте заглянуть в BukkitRunnable
Хорошо, но как мне запустить его асинхронно, я не могу найти достаточно хороший пример