gpt4 book ai didi

java - bukkit 插件内的套接字在使用后关闭

转载 作者:行者123 更新时间:2023-12-02 10:51:14 27 4
gpt4 key购买 nike

我正在尝试在 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();
}

参见this webpage了解更多信息。

关于java - bukkit 插件内的套接字在使用后关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com