From 99dc6a5b10d8ef0863e7189ab1cb201f0a3a47a0 Mon Sep 17 00:00:00 2001 From: zhangjiayu Date: Fri, 24 Dec 2021 15:45:31 +0800 Subject: [PATCH] =?UTF-8?q?Update:=E4=BF=AE=E6=94=B9=E4=B8=BA=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E6=A8=A1=E5=BC=8F=E5=88=9B=E5=BB=BA=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/montaro/aria2/Aria2Client.java | 147 +++++++++++++++ .../cn/montaro/aria2/Aria2ClientFactory.java | 26 +++ .../montaro/aria2/annotation/Aria2Method.java | 21 +++ .../cn/montaro/aria2/api/Aria2Client.java | 58 ------ .../websocket/Aria2WebSocketClient.java | 93 +-------- .../websocket/Aria2WebSocketConfig.java | 2 +- .../client/websocket/Aria2WebSocketProxy.java | 177 ++++++++++++++++++ .../websocket/Aria2WebSocketRequest.java | 3 - .../Aria2WebSocketClientException.java | 1 + .../Aria2MethodName.java} | 5 +- .../constants/WebSocketProtocol.java | 2 +- src/test/java/Aria2WebSocketClientTest.java | 26 +++ src/test/java/ClientTest.java | 26 --- 13 files changed, 412 insertions(+), 175 deletions(-) create mode 100644 src/main/java/cn/montaro/aria2/Aria2Client.java create mode 100644 src/main/java/cn/montaro/aria2/Aria2ClientFactory.java create mode 100644 src/main/java/cn/montaro/aria2/annotation/Aria2Method.java delete mode 100644 src/main/java/cn/montaro/aria2/api/Aria2Client.java create mode 100644 src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketProxy.java rename src/main/java/cn/montaro/aria2/{client/websocket/constants/Aria2Method.java => constants/Aria2MethodName.java} (94%) rename src/main/java/cn/montaro/aria2/{client/websocket => }/constants/WebSocketProtocol.java (79%) create mode 100644 src/test/java/Aria2WebSocketClientTest.java delete mode 100644 src/test/java/ClientTest.java diff --git a/src/main/java/cn/montaro/aria2/Aria2Client.java b/src/main/java/cn/montaro/aria2/Aria2Client.java new file mode 100644 index 0000000..60cf4cf --- /dev/null +++ b/src/main/java/cn/montaro/aria2/Aria2Client.java @@ -0,0 +1,147 @@ +package cn.montaro.aria2; + +import cn.montaro.aria2.annotation.Aria2Method; +import cn.montaro.aria2.constants.Aria2MethodName; + +import java.util.List; +import java.util.Map; + +/** + * Description: + * Aria2 Client Api + * + * @author ZhangJiaYu + * @date 2021/12/14 + */ +public interface Aria2Client { + + /** + * 添加文件下载 + * + * @param uris + * @param option + * @param position + * @return + */ + @Aria2Method(Aria2MethodName.ADD_URI) + String addUri(List uris, Map option, Integer position); + + @Aria2Method(Aria2MethodName.ADD_TORRENT) + String addTorrent(List uris, Map option, Integer position); + + @Aria2Method(Aria2MethodName.ADD_METALINK) + String addMetalink(List uris, Map option, Integer position); + + /** + * 移除一个下载任务,如果任务正在进行中,任务会先停止 + * + * @param gid GID + * @return 操作成功返回GID + */ + @Aria2Method(Aria2MethodName.REMOVE) + String remove(String gid); + + @Aria2Method(Aria2MethodName.FORCE_REMOVE) + String forceRemove(String gid); + + @Aria2Method(Aria2MethodName.PAUSE) + String pause(String gid); + + @Aria2Method(Aria2MethodName.PAUSE_ALL) + String pauseAll(); + + @Aria2Method(Aria2MethodName.FORCE_PAUSE) + String forcePause(String gid); + + @Aria2Method(Aria2MethodName.FORCE_PAUSE_ALL) + String forcePauseAll(); + + @Aria2Method(Aria2MethodName.UNPAUSE) + String unpause(String gid); + + @Aria2Method(Aria2MethodName.UNPAUSE_ALL) + String unpauseAll(); + + // TODO: define return type + @Aria2Method(Aria2MethodName.TELL_STATUS) + String tellStatus(String gid, String... keys); + + @Aria2Method(Aria2MethodName.GET_URIS) + String getUris(String gid); + + @Aria2Method(Aria2MethodName.GET_FILES) + String getFiles(String gid); + + @Aria2Method(Aria2MethodName.GET_PEERS) + String getPeers(String gid); + + @Aria2Method(Aria2MethodName.GET_SERVERS) + String getServers(String gid); + + @Aria2Method(Aria2MethodName.TELL_ACTIVE) + String tellActive(List keys); + + @Aria2Method(Aria2MethodName.TELL_WAITING) + String tellWaiting(int offset, int num, String... keys); + + @Aria2Method(Aria2MethodName.TELL_STOPPED) + String tellStopped(int offset, int num, String... keys); + + @Aria2Method(Aria2MethodName.CHANGE_POSITION) + Integer changePosition(String gid, Integer pos, String how); + + @Aria2Method(Aria2MethodName.CHANGE_URI) + String changeUri(String gid, int fileIndex, List delUris, List addUris); + + @Aria2Method(Aria2MethodName.GET_OPTION) + Map getOption(String gid); + + @Aria2Method(Aria2MethodName.CHANGE_OPTION) + String changeOption(String gid, Map options); + + @Aria2Method(Aria2MethodName.GET_GLOBAL_OPTION) + Map getGlobalOption(); + + @Aria2Method(Aria2MethodName.CHANGE_GLOBAL_OPTION) + String changeGlobalOption(Map options); + + @Aria2Method(Aria2MethodName.GET_GLOBAL_STAT) + String getGlobalStat(); + + @Aria2Method(Aria2MethodName.PURGE_DOWNLOAD_RESULT) + String purgeDownloadResult(); + + @Aria2Method(Aria2MethodName.REMOVE_DOWNLOAD_RESULT) + String removeDownloadResult(String gid); + + @Aria2Method(Aria2MethodName.GET_VERSION) + String getVersion(); + + @Aria2Method(Aria2MethodName.GET_SESSION_INFO) + String getSessionInfo(); + + @Aria2Method(Aria2MethodName.SHUTDOWN) + String shutdown(); + + @Aria2Method(Aria2MethodName.FORCE_SHUTDOWN) + String forceShutdown(); + + @Aria2Method(Aria2MethodName.SAVE_SESSION) + String saveSession(); + + @Aria2Method(Aria2MethodName.MULTICALL) + String multicall(List>> methods); + + /** + * 查询支持的方法列表 + * + * @return 方法列表 + */ + @Aria2Method(Aria2MethodName.LIST_METHODS) + List listMethods(); + + @Aria2Method(Aria2MethodName.LIST_NOTIFICATIONS) + List listNotifications(); + + +} diff --git a/src/main/java/cn/montaro/aria2/Aria2ClientFactory.java b/src/main/java/cn/montaro/aria2/Aria2ClientFactory.java new file mode 100644 index 0000000..0f4b1b5 --- /dev/null +++ b/src/main/java/cn/montaro/aria2/Aria2ClientFactory.java @@ -0,0 +1,26 @@ +package cn.montaro.aria2; + +import cn.montaro.aria2.client.websocket.Aria2WebSocketConfig; +import cn.montaro.aria2.client.websocket.Aria2WebSocketProxy; + +import java.lang.reflect.Proxy; + +/** + * Description: + * + * @author ZhangJiaYu + * @date 2021/12/22 + */ +public class Aria2ClientFactory { + + private static ClassLoader getClassLoader() { + return Thread.currentThread().getContextClassLoader(); + } + + public static Aria2Client webSocketClient(Aria2WebSocketConfig config) { + ClassLoader classLoader = getClassLoader(); + Aria2WebSocketProxy proxy = new Aria2WebSocketProxy(config); + Aria2Client webSocketClient = (Aria2Client) Proxy.newProxyInstance(classLoader, new Class[]{Aria2Client.class}, proxy); + return webSocketClient; + } +} diff --git a/src/main/java/cn/montaro/aria2/annotation/Aria2Method.java b/src/main/java/cn/montaro/aria2/annotation/Aria2Method.java new file mode 100644 index 0000000..c920019 --- /dev/null +++ b/src/main/java/cn/montaro/aria2/annotation/Aria2Method.java @@ -0,0 +1,21 @@ +package cn.montaro.aria2.annotation; + +import java.lang.annotation.*; + +/** + * Description: + * + * @author ZhangJiaYu + * @date 2021/12/22 + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Aria2Method { + /** + * 调用的方法名称 + * 如 aria2.addUri aria2.listMethods + * @return + */ + String value(); +} diff --git a/src/main/java/cn/montaro/aria2/api/Aria2Client.java b/src/main/java/cn/montaro/aria2/api/Aria2Client.java deleted file mode 100644 index b0c315d..0000000 --- a/src/main/java/cn/montaro/aria2/api/Aria2Client.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.montaro.aria2.api; - -import java.util.List; -import java.util.Map; - -/** - * Description: - * Aria2 Client Api - * - * @author ZhangJiaYu - * @date 2021/12/14 - */ -public interface Aria2Client { - - /** - * 添加文件下载 - * - * @param uris - * @param option - * @param position - * @return - */ - String addUri(List uris, Map option, Integer position); - - /** - * 查询支持的方法列表 - * - * @return 方法列表 - */ - List listMethods(); - - /** - * 移除一个下载任务,如果任务正在进行中,任务会先停止 - * - * @param gid GID - * @return 操作成功返回GID - */ - String remove(String gid); - - String forceRemove(String gid); - - String pause(String gid); - - String forcePause(String gid); - - String pauseAll(); - - String forcePauseAll(); - - String unpause(String gid); - - void tellStatus(String gid); - - void tellStopped(Integer offset, Integer num, String[] keys); - - void changePosition(String gid, Integer pos, String how); - -} diff --git a/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketClient.java b/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketClient.java index 769a668..e16bd4c 100644 --- a/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketClient.java +++ b/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketClient.java @@ -1,8 +1,8 @@ package cn.montaro.aria2.client.websocket; -import cn.montaro.aria2.api.Aria2Client; -import cn.montaro.aria2.client.websocket.constants.Aria2Method; +import cn.montaro.aria2.Aria2Client; +import cn.montaro.aria2.constants.Aria2MethodName; import cn.montaro.aria2.client.websocket.exception.Aria2WebSocketClientConnectTimeoutException; import cn.montaro.aria2.client.websocket.exception.Aria2WebSocketClientException; import cn.montaro.aria2.client.websocket.exception.Aria2WebSocketClientTimeoutException; @@ -27,7 +27,7 @@ import java.util.concurrent.TimeUnit; * @date 2021/12/15 */ @Slf4j -public class Aria2WebSocketClient extends WebSocketClient implements Aria2Client { +public class Aria2WebSocketClient extends WebSocketClient { private Gson gson = null; private Aria2WebSocketConfig config = null; @@ -147,6 +147,12 @@ public class Aria2WebSocketClient extends WebSocketClient implements Aria2Client return result.getResult(); } + private T getResult(Aria2WebSocketRequest request) { + String id = request.getId(); + this.sendRequest(request); + return this.waitResult(id); + } + /** * 清理id映射关系 * @@ -160,90 +166,9 @@ public class Aria2WebSocketClient extends WebSocketClient implements Aria2Client public String addUri(String[] uris) { List uriList = Arrays.asList(uris); - return this.addUri(uriList, null, null); - } - - @Override - public String addUri(List uris, Map option, Integer position) { - Aria2WebSocketRequest request = this.buildRequest( - Aria2Method.ADD_URI, - new TypeToken>() { - }.getType(), - uris, - option, - position - ); - String id = request.getId(); - this.sendRequest(request); - return this.waitResult(id); - } - - - @Override - public List listMethods() { - Aria2WebSocketRequest request = this.buildRequest( - Aria2Method.LIST_METHODS, - new TypeToken>>() { - }.getType() - ); - String id = request.getId(); - this.sendRequest(request); - return this.waitResult(id); - } - - @Override - public String remove(String s) { return null; } - @Override - public String forceRemove(String s) { - return null; - } - - @Override - public String pause(String s) { - return null; - } - - @Override - public String forcePause(String s) { - return null; - } - - @Override - public String pauseAll() { - return null; - } - - @Override - public String forcePauseAll() { - return null; - } - - @Override - public String unpause(String s) { - return null; - } - - @Override - public void tellStatus(String gid) { - - } - - // --------------WebSocket Client-------------- - - @Override - public void tellStopped(Integer offset, Integer num, String[] keys) { - - } - - @Override - public void changePosition(String gid, Integer pos, String how) { - - } - - @Override public void onOpen(ServerHandshake serverHandshake) { diff --git a/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketConfig.java b/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketConfig.java index 94fa84b..ef92bc6 100644 --- a/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketConfig.java +++ b/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketConfig.java @@ -1,6 +1,6 @@ package cn.montaro.aria2.client.websocket; -import cn.montaro.aria2.client.websocket.constants.WebSocketProtocol; +import cn.montaro.aria2.constants.WebSocketProtocol; import lombok.Data; import lombok.experimental.Accessors; diff --git a/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketProxy.java b/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketProxy.java new file mode 100644 index 0000000..5d1448c --- /dev/null +++ b/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketProxy.java @@ -0,0 +1,177 @@ +package cn.montaro.aria2.client.websocket; + +import cn.montaro.aria2.annotation.Aria2Method; +import cn.montaro.aria2.client.websocket.exception.Aria2WebSocketClientException; +import com.google.gson.*; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.handshake.ServerHandshake; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.net.URI; +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * Description: + * + * @author ZhangJiaYu + * @date 2021/12/22 + */ +@Slf4j +public class Aria2WebSocketProxy implements InvocationHandler { + + private final Gson gson; + private final WebSocketImpl webSocket; + private final Aria2WebSocketConfig config; + + @SneakyThrows + public Aria2WebSocketProxy(Aria2WebSocketConfig config) { + this.config = config; + this.gson = new GsonBuilder().create(); + this.webSocket = new WebSocketImpl(config.getURI()); + this.webSocket.connectBlocking(config.getTimeout(), TimeUnit.MILLISECONDS); + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Aria2Method aria2Method = method.getDeclaredAnnotation(Aria2Method.class); + String methodName = aria2Method.value(); + Aria2WebSocketRequest request = this.buildRequest(methodName, args); + Object o = this.sendRequest(request, method.getGenericReturnType()); + return o; + } + + /** + * 序列化参数 + * + * @param args + * @return + */ + private JsonElement serializeArguments(Object[] args) { + ArrayList arguments = new ArrayList<>(); + if (args != null && args.length != 0) { + arguments = new ArrayList<>(Arrays.asList(args)); + } + String secret = "token:"; + if (config.getSecret() != null) { + secret += config.getSecret(); + } + arguments.add(0, secret); + int size = arguments.size(); + ListIterator listIterator = arguments.listIterator(size); + while (listIterator.hasPrevious()) { + Object previous = listIterator.previous(); + if (previous == null) { + listIterator.remove(); + } else { + break; + } + } + return gson.toJsonTree(arguments); + } + + private String serializeRequest(Aria2WebSocketRequest request) { + return this.gson.toJson(request); + } + + /** + * 构建请求体 + * + * @param methodName 调用方法名称 如 aria2.addUri + * @param args 参数 + * @return + */ + private Aria2WebSocketRequest buildRequest(String methodName, Object[] args) { + Aria2WebSocketRequest request = new Aria2WebSocketRequest(); + String id = UUID.randomUUID().toString(); + request.setId(id); + request.setMethod(methodName); + request.setParams(serializeArguments(args)); + return request; + } + + + private T sendRequest(Aria2WebSocketRequest request, Type resultType) { + String id = request.getId(); + webSocket.send(serializeRequest(request)); + JsonObject returnResult = null; + while ((returnResult = this.webSocket.getResponse(id)) == null) { + Aria2WebSocketClientException exception = this.webSocket.getException(id); + if (exception != null) { + throw exception; + } + } + JsonElement result = returnResult.get("result"); + return gson.fromJson(result, resultType); + } + + ////////////////////////// WebSocket Client ////////////////////////// + + private class WebSocketImpl extends WebSocketClient { + + private final Map resultValueMap = new HashMap<>(); + private final Map resultExceptionMap = new HashMap<>(); + + public WebSocketImpl(URI serverUri) { + super(serverUri); + } + + public JsonObject getResponse(String id) { + JsonObject result = resultValueMap.get(id); + if (result != null) { + resultValueMap.remove(id); + return result; + } + return null; + } + + public Aria2WebSocketClientException getException(String id) { + Aria2WebSocketClientException exception = resultExceptionMap.get(id); + if (exception != null) { + resultExceptionMap.remove(id); + return exception; + } + return null; + } + + @Override + public void onOpen(ServerHandshake handshakedata) { + + } + + @Override + public void onMessage(String message) { + JsonElement jsonElement = JsonParser.parseString(message); + JsonObject jsonObject = jsonElement.getAsJsonObject(); + String id = jsonObject.get("id").getAsString(); + if (id == null) { + return; + } + try { + JsonObject error = jsonObject.getAsJsonObject("error"); + if (error != null) { + String errorMessage = error.get("message").getAsString(); + this.resultExceptionMap.put(id, new Aria2WebSocketClientException(errorMessage)); + return; + } + this.resultValueMap.put(id, jsonObject); + } catch (Exception e) { + this.resultExceptionMap.put(id, new Aria2WebSocketClientException(e)); + } + } + + @Override + public void onClose(int code, String reason, boolean remote) { + + } + + @Override + public void onError(Exception ex) { + + } + } +} diff --git a/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketRequest.java b/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketRequest.java index 6877cdf..eb17c73 100644 --- a/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketRequest.java +++ b/src/main/java/cn/montaro/aria2/client/websocket/Aria2WebSocketRequest.java @@ -1,13 +1,10 @@ package cn.montaro.aria2.client.websocket; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; -import java.util.Arrays; /** * Description: diff --git a/src/main/java/cn/montaro/aria2/client/websocket/exception/Aria2WebSocketClientException.java b/src/main/java/cn/montaro/aria2/client/websocket/exception/Aria2WebSocketClientException.java index 292b891..a4db2ad 100644 --- a/src/main/java/cn/montaro/aria2/client/websocket/exception/Aria2WebSocketClientException.java +++ b/src/main/java/cn/montaro/aria2/client/websocket/exception/Aria2WebSocketClientException.java @@ -9,6 +9,7 @@ package cn.montaro.aria2.client.websocket.exception; public class Aria2WebSocketClientException extends RuntimeException { public Aria2WebSocketClientException() { + super(); } public Aria2WebSocketClientException(String message) { diff --git a/src/main/java/cn/montaro/aria2/client/websocket/constants/Aria2Method.java b/src/main/java/cn/montaro/aria2/constants/Aria2MethodName.java similarity index 94% rename from src/main/java/cn/montaro/aria2/client/websocket/constants/Aria2Method.java rename to src/main/java/cn/montaro/aria2/constants/Aria2MethodName.java index 5f0a50a..1707239 100644 --- a/src/main/java/cn/montaro/aria2/client/websocket/constants/Aria2Method.java +++ b/src/main/java/cn/montaro/aria2/constants/Aria2MethodName.java @@ -1,4 +1,4 @@ -package cn.montaro.aria2.client.websocket.constants; +package cn.montaro.aria2.constants; /** * Description: @@ -7,7 +7,7 @@ package cn.montaro.aria2.client.websocket.constants; * @author ZhangJiaYu * @date 2021/12/14 */ -public class Aria2Method { +public class Aria2MethodName { private final static String ARIA2 = "aria2."; private final static String SYSTEM = "system."; @@ -39,6 +39,7 @@ public class Aria2Method { public final static String GET_VERSION = ARIA2 + "getVersion"; public final static String GET_GLOBAL_STAT = ARIA2 + "getGlobalStat"; public final static String GET_SESSION_INFO = ARIA2 + "getSessionInfo"; + public final static String GET_GLOBAL_OPTION = ARIA2 + "getGlobalOption"; public final static String CHANGE_URI = ARIA2 + "changeUri"; public final static String CHANGE_OPTION = ARIA2 + "changeOption"; diff --git a/src/main/java/cn/montaro/aria2/client/websocket/constants/WebSocketProtocol.java b/src/main/java/cn/montaro/aria2/constants/WebSocketProtocol.java similarity index 79% rename from src/main/java/cn/montaro/aria2/client/websocket/constants/WebSocketProtocol.java rename to src/main/java/cn/montaro/aria2/constants/WebSocketProtocol.java index f1086dd..c4c4c55 100644 --- a/src/main/java/cn/montaro/aria2/client/websocket/constants/WebSocketProtocol.java +++ b/src/main/java/cn/montaro/aria2/constants/WebSocketProtocol.java @@ -1,4 +1,4 @@ -package cn.montaro.aria2.client.websocket.constants; +package cn.montaro.aria2.constants; /** * Description: diff --git a/src/test/java/Aria2WebSocketClientTest.java b/src/test/java/Aria2WebSocketClientTest.java new file mode 100644 index 0000000..a9c9f22 --- /dev/null +++ b/src/test/java/Aria2WebSocketClientTest.java @@ -0,0 +1,26 @@ +import cn.montaro.aria2.Aria2Client; +import cn.montaro.aria2.Aria2ClientFactory; +import cn.montaro.aria2.client.websocket.Aria2WebSocketConfig; +import cn.montaro.aria2.client.websocket.Aria2WebSocketClient; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Description: + * + * @author ZhangJiaYu + * @date 2021/12/15 + */ +public class Aria2WebSocketClientTest { + + @Test + public void test() { + Aria2WebSocketConfig config = new Aria2WebSocketConfig().setSecret("123456"); + Aria2Client client = Aria2ClientFactory.webSocketClient(config); + String version = client.getVersion(); + System.out.println(version); + } +} diff --git a/src/test/java/ClientTest.java b/src/test/java/ClientTest.java deleted file mode 100644 index 614a006..0000000 --- a/src/test/java/ClientTest.java +++ /dev/null @@ -1,26 +0,0 @@ -import cn.montaro.aria2.api.Aria2Client; -import cn.montaro.aria2.client.websocket.Aria2WebSocketConfig; -import cn.montaro.aria2.client.websocket.Aria2WebSocketClient; -import org.junit.Test; - -import java.util.List; - -/** - * Description: - * - * @author ZhangJiaYu - * @date 2021/12/15 - */ -public class ClientTest { - - @Test - public void test() { - Aria2WebSocketConfig aria2WebSocketConfig = new Aria2WebSocketConfig(); - aria2WebSocketConfig.setSecret("123456"); - Aria2Client client = new Aria2WebSocketClient(aria2WebSocketConfig); - List methods = client.listMethods(); - for (String method : methods) { - System.out.println(method); - } - } -}