diff --git a/java/socketd-transport-test/src/test/java/benchmark/BenchmarkTest.java b/java/socketd-transport-test/src/test/java/benchmark/BenchmarkTest.java
index 5686d95c15cb02c6c09f07cb0a8615f4d6322fe7..77a3da4e8e35f7627444a06287c144e3b112b700 100644
--- a/java/socketd-transport-test/src/test/java/benchmark/BenchmarkTest.java
+++ b/java/socketd-transport-test/src/test/java/benchmark/BenchmarkTest.java
@@ -18,6 +18,7 @@ public class BenchmarkTest {
"sd:tcp-smartsocket",
"sd:ws-java",
"sd:udp-java",
+ "sd:udp-neta",
"sd:udp-netty",
"sd:kcp-java",
};
diff --git a/java/socketd-transport-test/src/test/java/benchmark/WrkServer.java b/java/socketd-transport-test/src/test/java/benchmark/WrkServer.java
index c9276a052f0015e8bd42a972547713bc8ef1d018..e097e79bef205b8824578d9e5655e63ac068a41c 100644
--- a/java/socketd-transport-test/src/test/java/benchmark/WrkServer.java
+++ b/java/socketd-transport-test/src/test/java/benchmark/WrkServer.java
@@ -26,6 +26,7 @@ public class WrkServer implements LifecycleBean {
"sd:tcp-smartsocket",
"sd:ws-java",
"sd:udp-java",
+ "sd:udp-neta",
"sd:udp-netty",
"sd:kcp-java",
};
diff --git a/java/socketd-transport-test/src/test/java/features/CaseTest.java b/java/socketd-transport-test/src/test/java/features/CaseTest.java
index 139c2d50f93c539c1121652077756c39e981ea8a..de394a3294c4763c26e49db5ba4e20b69ad12f97 100644
--- a/java/socketd-transport-test/src/test/java/features/CaseTest.java
+++ b/java/socketd-transport-test/src/test/java/features/CaseTest.java
@@ -12,11 +12,13 @@ import org.noear.solon.test.SolonTest;
public class CaseTest {
static final String[] schemas = new String[]{
"sd:tcp-java",
+ "sd:udp-neta",
"sd:tcp-netty",
"sd:tcp-smartsocket",
"sd:tcp-neta",
"sd:ws-java",
"sd:udp-java",
+ "sd:udp-neta",
"sd:udp-netty",
"sd:kcp-java",
};
diff --git a/java/socketd-transport-test/src/test/java/features/CaseTest2.java b/java/socketd-transport-test/src/test/java/features/CaseTest2.java
index 644f93da72e9f18732a89e4f4304d52e57c9457b..7939c8a634d8e40858404e3c6f39cdf1a86d21d9 100644
--- a/java/socketd-transport-test/src/test/java/features/CaseTest2.java
+++ b/java/socketd-transport-test/src/test/java/features/CaseTest2.java
@@ -14,11 +14,12 @@ import org.noear.solon.test.SolonTest;
public class CaseTest2 {
static final String[] schemas = new String[]{
"sd:tcp-java",
+ "sd:tcp-neta",
"sd:tcp-netty",
"sd:tcp-smartsocket",
- "sd:tcp-neta",
"sd:ws-java",
"sd:udp-java",
+ "sd:udp-neta",
// "sd:udp-netty",
"sd:kcp-java",
};
diff --git a/java/socketd-transport-test/src/test/java/features/cases/TestCase14_fileUpload.java b/java/socketd-transport-test/src/test/java/features/cases/TestCase14_fileUpload.java
index 7281daf5625774691cbe8ad7fc9868675471ad33..ea8ae482a609645030a1971fbeffcf55f682a42c 100644
--- a/java/socketd-transport-test/src/test/java/features/cases/TestCase14_fileUpload.java
+++ b/java/socketd-transport-test/src/test/java/features/cases/TestCase14_fileUpload.java
@@ -49,7 +49,7 @@ public class TestCase14_fileUpload extends BaseTestCase {
if (fileName != null) {
System.out.println(fileName);
- File fileNew = new File("/Users/noear/Downloads/socketd-upload.mov");
+ File fileNew = new File("/Users/yongchun.zyc/Downloads/socketd-upload.mov");
fileNew.delete();
fileNew.createNewFile();
@@ -78,7 +78,7 @@ public class TestCase14_fileUpload extends BaseTestCase {
AtomicInteger fileCount = new AtomicInteger();
AtomicInteger fileTotal = new AtomicInteger();
- FileEntity fileEntity = new FileEntity(new File("/Users/noear/Movies/snack3-rce-poc.mov"));
+ FileEntity fileEntity = new FileEntity(new File("/Users/yongchun.zyc/Downloads/QQMusicMac10.4.0Build01.dmg"));
clientSession.send("/user/upload", fileEntity).thenProgress((isSend, val, max) -> {
if (isSend) {
fileCount.incrementAndGet();
@@ -94,7 +94,7 @@ public class TestCase14_fileUpload extends BaseTestCase {
System.out.println("fileCount: " + fileCount.get() + ", fileTotal: " + fileTotal.get());
Assertions.assertEquals(messageCounter.get(), 1, getSchema() + ":server 收的消息数量对不上");
- File file = new File("/Users/noear/Downloads/socketd-upload.mov");
+ File file = new File("/Users/yongchun.zyc/Downloads/socketd-upload.mov");
assert file.length() > 1024 * 1024 * 10;
//assert fileCount.get() > 0;
//assert fileCount.get() == fileTotal.get();
diff --git a/java/socketd-transport-test/src/test/java/features/cases/TestCase22_ssl.java b/java/socketd-transport-test/src/test/java/features/cases/TestCase22_ssl.java
index 47d7309e7d2aff74307c17bd1074f8510e4d45c3..90cd730bc8c47b524d3633ee5d3ad86209dc86a3 100644
--- a/java/socketd-transport-test/src/test/java/features/cases/TestCase22_ssl.java
+++ b/java/socketd-transport-test/src/test/java/features/cases/TestCase22_ssl.java
@@ -1,7 +1,7 @@
package features.cases;
+import net.hasor.cobble.ResourcesUtils;
import org.junit.jupiter.api.Assertions;
-import org.noear.socketd.utils.SslContextBuilder;
import org.noear.socketd.SocketD;
import org.noear.socketd.transport.client.ClientSession;
import org.noear.socketd.transport.core.Entity;
@@ -10,12 +10,18 @@ import org.noear.socketd.transport.core.Session;
import org.noear.socketd.transport.core.entity.StringEntity;
import org.noear.socketd.transport.core.listener.SimpleListener;
import org.noear.socketd.transport.server.Server;
+import org.noear.socketd.utils.SslContextBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URL;
+import java.security.KeyStore;
+import java.security.cert.X509Certificate;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -31,61 +37,95 @@ public class TestCase22_ssl extends BaseTestCase {
super(schema, port);
}
- private Server server;
+ private Server server;
private ClientSession clientSession;
- private AtomicInteger serverOnMessageCounter = new AtomicInteger();
+ private AtomicInteger serverOnMessageCounter = new AtomicInteger();
private AtomicInteger clientSubscribeReplyCounter = new AtomicInteger();
private SSLContext getSSLContext() throws Exception {
URL url = TestCase22_ssl.class.getClassLoader().getResource("ssl/demo_store.pfx");
- return new SslContextBuilder()
- .keyManager(url.openStream(), "PKCS12", "1234")
- .build();
+ return new SslContextBuilder().keyManager(url.openStream(), "PKCS12", "1234").build();
+ }
+
+ public static SSLContext getSSLContext(String protocol) throws Exception {
+ char[] password = "123456".toCharArray();
+ KeyStore jsk = KeyStore.getInstance("JKS");
+ jsk.load(ResourcesUtils.getResourceAsStream("ssl/jks/keystore.jks"), password);
+
+ // Set up key manager factory to use our key store
+ String keyAlgorithm = KeyManagerFactory.getDefaultAlgorithm();
+ KeyManagerFactory kmf = KeyManagerFactory.getInstance(keyAlgorithm);
+ kmf.init(jsk, password);
+
+ // SSL Server
+ SSLContext sslContext = SSLContext.getInstance(protocol);
+ sslContext.init(kmf.getKeyManagers(), new TrustManager[] { new MyTrustManager() }, null);
+
+ return sslContext;
+ }
+
+ static class MyTrustManager implements TrustManager, X509TrustManager {
+ public X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+
+ public boolean isServerTrusted(X509Certificate[] certs) {
+ return true;
+ }
+
+ public boolean isClientTrusted(X509Certificate[] certs) {
+ return true;
+ }
+
+ public void checkServerTrusted(X509Certificate[] certs, String authType) {
+ return;
+ }
+
+ public void checkClientTrusted(X509Certificate[] certs, String authType) {
+ return;
+ }
}
@Override
public void start() throws Exception {
log.trace("...");
- SSLContext sslContext = getSSLContext();
+ //SSLContext sslContext = getSSLContext();
+ SSLContext sslContext = getSSLContext("TLSv1.2"); // SslProtocol see net.hasor.neta.handler.codec.ssl.SslProtocol
super.start();
//server
- server = SocketD.createServer(getSchema())
- .config(c -> c.port(getPort()).sslContext(sslContext))
- .listen(new SimpleListener() {
- @Override
- public void onMessage(Session session, Message message) throws IOException {
- System.out.println("::" + message);
- serverOnMessageCounter.incrementAndGet();
-
- if (message.isRequest()) {
- session.reply(message, new StringEntity("hi reply")); //这之后,无效了
- session.reply(message, new StringEntity("hi reply**"));
- }
-
- if (message.isSubscribe()) {
- session.reply(message, new StringEntity("hi reply"));
- session.reply(message, new StringEntity("hi reply**"));
- session.replyEnd(message, new StringEntity("hi reply****")); //这之后,无效了
- session.reply(message, new StringEntity("hi reply******"));
- session.reply(message, new StringEntity("hi reply********"));
- }
-
- session.send("demo", new StringEntity("test"));
- }
- })
- .start();
+ server = SocketD.createServer(getSchema()).config(c -> c.port(getPort()).sslContext(sslContext)).listen(new SimpleListener() {
+ @Override
+ public void onMessage(Session session, Message message) throws IOException {
+ System.out.println("::" + message);
+ serverOnMessageCounter.incrementAndGet();
+
+ if (message.isRequest()) {
+ session.reply(message, new StringEntity("hi reply")); //这之后,无效了
+ session.reply(message, new StringEntity("hi reply**"));
+ }
+
+ if (message.isSubscribe()) {
+ session.reply(message, new StringEntity("hi reply"));
+ session.reply(message, new StringEntity("hi reply**"));
+ session.replyEnd(message, new StringEntity("hi reply****")); //这之后,无效了
+ session.reply(message, new StringEntity("hi reply******"));
+ session.reply(message, new StringEntity("hi reply********"));
+ }
+
+ session.send("demo", new StringEntity("test"));
+ }
+ }).start();
//休息下,启动可能要等会儿
Thread.sleep(1000);
-
//client
String serverUrl = getSchema() + "://127.0.0.1:" + getPort() + "/path?u=a&p=2";
- clientSession = SocketD.createClient(serverUrl).config(c->c.sslContext(sslContext)).openOrThow();
+ clientSession = SocketD.createClient(serverUrl).config(c -> c.sslContext(sslContext)).openOrThow();
clientSession.send("/user/created", new StringEntity("hi"));
Entity response = clientSession.sendAndRequest("/user/get", new StringEntity("hi")).await();
diff --git a/java/socketd-transport-test/src/test/java/features/cases/TestCase24_bigFile_1g.java b/java/socketd-transport-test/src/test/java/features/cases/TestCase24_bigFile_1g.java
index ef732c3275aa170c8f7683822906bf95e3c77071..633773a631d9b7e3e7a9d99c703ab00b5e5fce46 100644
--- a/java/socketd-transport-test/src/test/java/features/cases/TestCase24_bigFile_1g.java
+++ b/java/socketd-transport-test/src/test/java/features/cases/TestCase24_bigFile_1g.java
@@ -58,7 +58,7 @@ public class TestCase24_bigFile_1g extends BaseTestCase {
if (fileName != null) {
System.out.println(fileName);
- File fileNew = new File("/Users/noear/Downloads/socketd-big-upload.mov");
+ File fileNew = new File("/Users/yongchun.zyc/Downloads/socketd-big-upload.mov");
fileNew.delete();
fileNew.createNewFile();
@@ -87,7 +87,7 @@ public class TestCase24_bigFile_1g extends BaseTestCase {
String serverUrl = getSchema() + "://127.0.0.1:" + getPort() + "/path?u=a&p=2";
clientSession = SocketD.createClient(serverUrl).openOrThow();
- FileEntity fileEntity = new FileEntity(new File("/Users/noear/Movies/[Socket.D 实战] 直播手写 FolkMQ (4).mov"));
+ FileEntity fileEntity = new FileEntity(new File("/Users/yongchun.zyc/Downloads/atlassian-confluence-7.17.1.zip"));
clientSession.send("/user/upload", fileEntity);
fileEntity.release();
@@ -99,7 +99,7 @@ public class TestCase24_bigFile_1g extends BaseTestCase {
System.out.println("counter: " + messageCounter.get());
Assertions.assertEquals(messageCounter.get(), 1, getSchema() + ":server 收的消息数量对不上");
- File file = new File("/Users/noear/Downloads/socketd-big-upload.mov");
+ File file = new File("/Users/yongchun.zyc/Downloads/socketd-big-upload.mov");
assert file.length() > 1024 * 1024 * 10;
}
diff --git a/java/socketd-transport-test/src/test/java/features/cases/TestCase27_smallFile.java b/java/socketd-transport-test/src/test/java/features/cases/TestCase27_smallFile.java
index 0d2c77974b6c5f03f04bddb6045d95527476951a..1925e32f9ba8481025b9cd50f9e75c1392558004 100644
--- a/java/socketd-transport-test/src/test/java/features/cases/TestCase27_smallFile.java
+++ b/java/socketd-transport-test/src/test/java/features/cases/TestCase27_smallFile.java
@@ -54,7 +54,7 @@ public class TestCase27_smallFile extends BaseTestCase {
if (fileName != null) {
System.out.println(fileName);
- File fileNew = new File("/Users/noear/Downloads/socketd-upload.png");
+ File fileNew = new File("/Users/yongchun.zyc/Downloads/socketd-upload.png");
fileNew.delete();
fileNew.createNewFile();
@@ -80,7 +80,7 @@ public class TestCase27_smallFile extends BaseTestCase {
clientSession = SocketD.createClient(serverUrl)
.openOrThow();
- FileEntity fileEntity = new FileEntity(new File("/Users/noear/Movies/upload_test.png"));
+ FileEntity fileEntity = new FileEntity(new File("/Users/yongchun.zyc/Downloads/osc.zip"));
clientSession.send("/user/upload", fileEntity);
fileEntity.release();
@@ -90,7 +90,7 @@ public class TestCase27_smallFile extends BaseTestCase {
System.out.println("counter: " + messageCounter.get());
Assertions.assertEquals(messageCounter.get(), 1, getSchema() + ":server 收的消息数量对不上");
- File file = new File("/Users/noear/Downloads/socketd-upload.png");
+ File file = new File("/Users/yongchun.zyc/Downloads/socketd-upload.png");
assert file.length() > 1024;
}
diff --git a/java/socketd-transport-test/src/test/java/features/cases/TestCase29_downloadProgress.java b/java/socketd-transport-test/src/test/java/features/cases/TestCase29_downloadProgress.java
index 2767245279aaf57d4c0ccbdaa93c9292b171870b..50282c457adc75d4a68b0254dc670fc2b4eaf7e4 100644
--- a/java/socketd-transport-test/src/test/java/features/cases/TestCase29_downloadProgress.java
+++ b/java/socketd-transport-test/src/test/java/features/cases/TestCase29_downloadProgress.java
@@ -42,7 +42,7 @@ public class TestCase29_downloadProgress extends BaseTestCase {
.listen(new EventListener().doOn("/download", (s, m) -> {
messageCounter.incrementAndGet();
if (m.isRequest()) {
- FileEntity fileEntity = new FileEntity(new File("/Users/noear/Movies/snack3-rce-poc.mov"));
+ FileEntity fileEntity = new FileEntity(new File("/Users/yongchun.zyc/Downloads/atlassian-confluence-7.17.1.zip"));
s.reply(m, fileEntity);
}
}))
diff --git a/java/socketd-transport-test/src/test/java/labs/ClientTest.java b/java/socketd-transport-test/src/test/java/labs/ClientTest.java
index dfc7eadf12f88e966061d5391ee6a843a5e1a2aa..079bba9dad2cabd1b374138c4dfb03e509ea03d1 100644
--- a/java/socketd-transport-test/src/test/java/labs/ClientTest.java
+++ b/java/socketd-transport-test/src/test/java/labs/ClientTest.java
@@ -5,13 +5,14 @@ import org.noear.socketd.SocketD;
public class ClientTest {
static final String[] schemas = new String[]{
"sd:tcp-java",
+ "sd:tcp-neta",//1
"sd:tcp-netty",
"sd:tcp-smartsocket",
- "sd:tcp-neta",//3
"sd:ws-java",
"sd:udp-java",//5
+ "sd:udp-neta",
"sd:udp-netty",
- "sd:kcp-java",//7
+ "sd:kcp-java",//8
};
public static void main(String[] args) {
diff --git a/java/socketd-transport-test/src/test/java/labs/DebugTest.java b/java/socketd-transport-test/src/test/java/labs/DebugTest.java
index f44df1c7819d3d34901f76e3527ea979a97a3bd8..09cd84c2ae602e2e89af8b325c3e02be024fdb7f 100644
--- a/java/socketd-transport-test/src/test/java/labs/DebugTest.java
+++ b/java/socketd-transport-test/src/test/java/labs/DebugTest.java
@@ -8,13 +8,14 @@ import org.noear.solon.test.SolonTest;
public class DebugTest {
static final String[] schemas = new String[]{
"sd:tcp-java",
+ "sd:tcp-neta",//1
"sd:tcp-netty",
"sd:tcp-smartsocket",
- "sd:tcp-neta",//3
"sd:ws-java",
"sd:udp-java",//5
+ "sd:udp-neta",
"sd:udp-netty",
- "sd:kcp-java",//7
+ "sd:kcp-java",//8
};
/**
@@ -22,7 +23,7 @@ public class DebugTest {
*/
@Test
public void main() throws Exception {
- String s1 = schemas[4];
+ String s1 = schemas[0];
BaseTestCase testCase = new TestCase22_ssl(s1, 8602);
try {
testCase.start();
diff --git a/java/socketd-transport-test/src/test/java/labs/ServerTest.java b/java/socketd-transport-test/src/test/java/labs/ServerTest.java
index 44e9661aced68f84a9b67baab41696b9579f9429..b07f7030e9aac8913178c2d9d56b611104d30bc3 100644
--- a/java/socketd-transport-test/src/test/java/labs/ServerTest.java
+++ b/java/socketd-transport-test/src/test/java/labs/ServerTest.java
@@ -15,13 +15,14 @@ import java.io.File;
public class ServerTest {
static final String[] schemas = new String[]{
"sd:tcp-java",
+ "sd:tcp-neta",//1
"sd:tcp-netty",
"sd:tcp-smartsocket",
- "sd:tcp-neta",//3
"sd:ws-java",
"sd:udp-java",//5
+ "sd:udp-neta",
"sd:udp-netty",
- "sd:kcp-java",//7
+ "sd:kcp-java",//8
};
/**
diff --git a/java/socketd-transport-test/src/test/java/labs/StopTest.java b/java/socketd-transport-test/src/test/java/labs/StopTest.java
index 5fbc2739b212c09f8e2ad7240e60b0a56d1e97df..10ce56c92099e6b10b125a43f61704712786332a 100644
--- a/java/socketd-transport-test/src/test/java/labs/StopTest.java
+++ b/java/socketd-transport-test/src/test/java/labs/StopTest.java
@@ -12,13 +12,14 @@ import org.noear.solon.Solon;
public class StopTest {
static final String[] schemas = new String[]{
"sd:tcp-java",
+ "sd:tcp-neta",//1
"sd:tcp-netty",
"sd:tcp-smartsocket",
- "sd:tcp-neta",//3
"sd:ws-java",
"sd:udp-java",//5
+ "sd:udp-neta",
"sd:udp-netty",
- "sd:kcp-java",//7
+ "sd:kcp-java",//8
};
static int schemaIdx = 7;//6,5,4,3,2,1
diff --git a/java/socketd-transport-test/src/test/java/labs/cae01_bigupload/BigUploadClient.java b/java/socketd-transport-test/src/test/java/labs/cae01_bigupload/BigUploadClient.java
index c7bf71cea8d0dd088d50466ceac2459e44bb9654..98bc0f37ab4e7989d059f62ebcf54a7e1ec8ee4f 100644
--- a/java/socketd-transport-test/src/test/java/labs/cae01_bigupload/BigUploadClient.java
+++ b/java/socketd-transport-test/src/test/java/labs/cae01_bigupload/BigUploadClient.java
@@ -16,7 +16,9 @@ public class BigUploadClient {
"sd:tcp-netty",
"sd:tcp-smartsocket",
"sd:ws-java",
- "sd:udp-java"};
+ "sd:udp-java",
+ "sd:udp-neta",
+ };
static String getSchema() {
return schemas[2];
diff --git a/java/socketd-transport-test/src/test/java/labs/cae01_bigupload/BigUploadServer.java b/java/socketd-transport-test/src/test/java/labs/cae01_bigupload/BigUploadServer.java
index de178052e532480468dfbf1007145bc47f59f902..cefc1ed4a966ed22fd70e7b762c745609bc0cbd4 100644
--- a/java/socketd-transport-test/src/test/java/labs/cae01_bigupload/BigUploadServer.java
+++ b/java/socketd-transport-test/src/test/java/labs/cae01_bigupload/BigUploadServer.java
@@ -22,7 +22,9 @@ public class BigUploadServer {
"sd:tcp-netty",
"sd:tcp-smartsocket",
"sd:ws-java",
- "sd:udp-java"};
+ "sd:udp-java",
+ "sd:udp-neta",
+ };
static String getSchema() {
return schemas[2];
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/ca.crt b/java/socketd-transport-test/src/test/resources/ssl/ca/ca.crt
new file mode 100644
index 0000000000000000000000000000000000000000..f81efb3d5196c7367046976033b0367d0bc6c7b8
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/ca.crt
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEqjCCApICCQCGJE6498YPOTANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAsq
+Lmhhc29yLm5ldDAgFw0yNDAxMjAwNTAwMjJaGA8zMDIzMDUyMzA1MDAyMlowFjEU
+MBIGA1UEAwwLKi5oYXNvci5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQDUDYDTXJeyAycohMvsEUdYytMLsPQiRmOSxVu/jxNlbOoasXaKwLX0U6/f
+/xfAWlR1VW3TU4TgRBFWGpXEXTnxiVaynddiVNzxt4Ja3G+IZ9YvOxR1kraWa6cj
+6e9DIWPQYXC+HZgYwUGNUpxEzBhs4lGiZjBTOn/Ys9Xa9ylSFHpbvck5eS/cQMQL
+Iw1EZBd75FV8vCZgzSGTP79OJCE/F1GHRlsg2KZVh3FTvH+bBqoQ7MCS9StDPffR
+o7OwbFglFfOfi4IHlGASSSSssJuyJLDAbHTSFTaoTa3uhzFiYGJu1/TSGGJuHMun
+lkLs14Y5OMYn1pMVRceTnVGnTmM53B0NwEPByNhjakqog0o86e9CJ8eELWKOxUQe
+g5WOk3rjvgZCPO6eH9Ijtta0ZFLU+JhXyON1V8xXHZZFF0vBeLqsPubcBh0kqpYK
+Hx3SEW74H/4pjCG0mM9lM5EYRrprQYHJBcTxGh6Sl7KXQYSZhdDyHG40x2hl3ugF
+j6hP5iohZv7jjOlcRiLXLvXuSRk8Orf+avdYvbxQYz8Kgj9oJZf7zFMJ2vMix7v8
+GEGL6zjQz7NFzAQfHFmyXTUle0DMlJpXR3ICt/CQuVpQVLQANlw+/hjs6Or28c1U
+0ofMkN6D6TIaZMIt2CbG/iqdgSEQYjYAZbmTxxFfJfab+DJvtwIDAQABMA0GCSqG
+SIb3DQEBCwUAA4ICAQCye9ICWsrj5OGWIfhZPFriR53MewPcWeuUDSH2hOeujDRJ
+qQm5Bv4HBfIOb8rCpL4JFtT3H3ATH/E4Sc7BVLdEAWtQqnCYmqMMjlPEW4GTzj5u
+qmlAzKfW8lNRebHH/qKACa6Dbff8hny7n2fxC8rUdOtIVViQU0UrUhzugl7yCOeN
+rpRJPQOO6+LhkxuJf6UdhjozOU9ZyPVzLLyMcn/UGmzqHW2kn3ASkMPk2DjCP5rU
+OQvWC2/dWUjN/nl9yMO4PK0HS14ArxRNw1kb0X/ONgf11uIhvxurHXw3dIbOfDwR
+nIFzYVtiwxgepZsdD0R8qqUm1x0LUo/bJGzTzouB6cqe1ZATDAaeSrDVxR65AbJ6
+SK9eSnI+Asr3hLG9hVnir8Eijis9IsBH4buXXwdtwOjgE2TAEdKTBv1m5NlNQTsP
+BghqdAl8f9O69248bZtla1s2eL5BvR22wcDf/0b+cRzxaWaZDgaklz0zpuPVqwPo
+nmzZK0mgx+Zrr2gxLmGbcSS4RqLgOyu1HzzZ5tDuZPZV4U1jsoGNXMZdVDVncI6B
+gHwcapDaBqMdVH9kTE5sMT+4/UrlPyqAoL+w+1ix+n9dgluNSuFjPaiVby+MR40p
+6/Wqid8/R9jZ1qKUyL6adkDLEMpd/8d2dEh1r3IiJVAeAylb0YKVjmZVSiEQdw==
+-----END CERTIFICATE-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/ca.key b/java/socketd-transport-test/src/test/resources/ssl/ca/ca.key
new file mode 100644
index 0000000000000000000000000000000000000000..eef59222df00650c5dd7580fd14794b3b266fa65
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/ca.key
@@ -0,0 +1,54 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,2AC749C255B79319
+
+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
+-----END RSA PRIVATE KEY-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/client.crt b/java/socketd-transport-test/src/test/resources/ssl/ca/client.crt
new file mode 100644
index 0000000000000000000000000000000000000000..efd925efd30849403172ea08b4f3a1ac0a38dfb2
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/client.crt
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEoDCCAogCAQEwDQYJKoZIhvcNAQELBQAwFjEUMBIGA1UEAwwLKi5oYXNvci5u
+ZXQwIBcNMjQwMTIwMDUwMDI0WhgPMzAyMzA1MjMwNTAwMjRaMBQxEjAQBgNVBAMM
+CWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNwHHWj
+//ryfGh5iuS+9zUTlh4miThghV+mPWpDHb5xi4xYtx+e+OR9oWnaYfecRRnben8C
+0qx/KIv5atGNQGZvn+opCiLYvHiLFOXO28XXgwbX5Sr6x4+ekc3nvRjm8SkgBJst
+mclZ5203gIrluUnMbUk6OrmLtrrNNup4aT1ZLt87Ox2RjzgyN+g3Py1i7r3BaLGS
+hIv4fc7epF4YIA4DNNcI79TLr73jovio0yj/ah+L5JpXjU5eeCWJFCMR/0OdaVL2
+KvoscUSxzG6G84+AzU4cQ8oyQwP5qeL7ocitbI93KBjZ4Reui/V9OlIw+Dw7FMPv
+0DjFeKy0rmdS2yIbVf6Vuwue/02WLgjo86sZSAHo6AZSwhP7a4+sDsHQoiXZtazu
+2H7Zyd7dVABQz5q6TbSDEHdGvQVgBlApeBCkmSpmlImNjad7IaR8z9M/JjrWKhoJ
+KzZvMmmUAe990Y5NS2fkf/4FKk10El1nFtEL3ZIJtM2kQ45sTL7KmiOXbfsvHdzj
+0tTOk22g+d3SungJcUyAY5750zoG+QNi2ysLyaNZ4yZ16oIxhTPVphmF0y73acBY
+DUZj+Qkn3vze8EYqZQSYiLFGkXVzLsVrD6LQ+66VmhSvMGOuco4bsiD1mYqlsMYv
++uzo68DE/TT8bPuHGszyFhAcCQvkv3Me5ZgdAgMBAAEwDQYJKoZIhvcNAQELBQAD
+ggIBAGYZuIpXa7Hhm75b8AUUM/CFPm6fEeQsUHKzJAX3xgCtiZgLW7J2YfBbtqBv
+1mAseKkY8/ndyw4YHAr9czp7RzELL1AYieJcGTgdfTKJmESn/rLdyMLCcKhFt+fA
+yXBi/oLbdeERsFXnvTXqb8ogHjXRXQMfrn0WukAKcxEakZJtqveU0K8WbJemQP6t
+6GyVNtABOphN6FfdcniDgpGr46v4gjXi8T4DEozEOA2jdTBC8XhcPZTR5QZLD/ZO
+Ut74TUhKgL2G28KYJA5eI2pZoomMBWREOoSwWlYQ0qw8yOVXYDUmWI/5WTXh5GfR
+vfKZpCz4vVpMu0pgpAj5XyjX1DhkYK+HKtytOjT2FpphsAaJQht1yi89342nUfdR
+mCSyT2dbTE+04BN3Xi+6ph5dVvs7bNn9psh/6HVZnjEvagf1qV1yTeIftS2kuuKd
+jctX40QM2yUN2UrOASeAvY/WVCfvqoW4YBDUCYDcsLADxGtIj0Z1SLWSniKqniCN
+/JVdWtbxogelKhdewPDoMznmH8fGOR3RDy+CZnroRfFN5aB51PmILyoInF1wttVD
+SRNPXyc0jIF2PsqBBk92ZSl40my2cCpt30HLqnLd2WRbaJk/WoaKzjkvehqX6UPj
+6pJa0axPnyzes5r3XDzhlyqZPOZXqFRzHloLGusRwr6tscmm
+-----END CERTIFICATE-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/client.csr b/java/socketd-transport-test/src/test/resources/ssl/ca/client.csr
new file mode 100644
index 0000000000000000000000000000000000000000..3403fecb2740fb4b3685409bf292c958012334a7
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/client.csr
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAo3AcdaP/+vJ8aHmK5L73NROWHiaJOGCFX6Y9akMd
+vnGLjFi3H5745H2hadph95xFGdt6fwLSrH8oi/lq0Y1AZm+f6ikKIti8eIsU5c7b
+xdeDBtflKvrHj56Rzee9GObxKSAEmy2ZyVnnbTeAiuW5ScxtSTo6uYu2us026nhp
+PVku3zs7HZGPODI36Dc/LWLuvcFosZKEi/h9zt6kXhggDgM01wjv1MuvveOi+KjT
+KP9qH4vkmleNTl54JYkUIxH/Q51pUvYq+ixxRLHMbobzj4DNThxDyjJDA/mp4vuh
+yK1sj3coGNnhF66L9X06UjD4PDsUw+/QOMV4rLSuZ1LbIhtV/pW7C57/TZYuCOjz
+qxlIAejoBlLCE/trj6wOwdCiJdm1rO7YftnJ3t1UAFDPmrpNtIMQd0a9BWAGUCl4
+EKSZKmaUiY2Np3shpHzP0z8mOtYqGgkrNm8yaZQB733Rjk1LZ+R//gUqTXQSXWcW
+0Qvdkgm0zaRDjmxMvsqaI5dt+y8d3OPS1M6TbaD53dK6eAlxTIBjnvnTOgb5A2Lb
+KwvJo1njJnXqgjGFM9WmGYXTLvdpwFgNRmP5CSfe/N7wRiplBJiIsUaRdXMuxWsP
+otD7rpWaFK8wY65yjhuyIPWZiqWwxi/67OjrwMT9NPxs+4cazPIWEBwJC+S/cx7l
+mB0CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQAaFKq485ClGj16jr6cYRLXsULT
+MRpa5k0bvMf5k98PwHrs22s/M8ydVlk8rjWb0uSYGvyYitT8cIqPH+i3rC/p3K2p
+IN9H+l4sgv2dDV86HhBzYfOqBmQ1gz56kIHBL78BaF62pXNIZE1jHOhbZhlxdRnN
+hukHWC3mRU3VsYDckzkiUmDpfrIpvA+PCf4JMPqyIxd7RHZ4lbFBWGk6x8a01EiO
+SYOPBX370q9wZI5hbFwtu+DYRlfXu0M6EpRpP5XhwlsZNC4v7WtD1pbOpoiSRY0a
+a8YWsqtO7inxI2SS9yDV+hOSNHuldfocvvvJxHcJpLetkSpowXcpwfzNVrDM1bbs
+CZI7i2wzA6vFLQz+d2MvBT7errWlhPuQNy38MScrPoV8s21IEl2flu+s9uGs0HWh
+CrYiuCQ01/Ow68krrlNSaQtcVqIu3BziNn1FSt9S/V5sebSvkR6kqEGRs9oB3AMg
+eEwblh0f5UCd6TacWz2wy3rIGqmTQ2EA6X3g6sW/Fj+BUtpGwJIovnrnUrq6qI3Q
+GrtP7NlRsZpXwDnk8hqlCd6yeNb6L+jAJvtj26/HhFz1/h1QILqNqIL5tiiX6mQE
+CFub1HwR3AlUPq5OOKDFvjw8fTMaHORX7AEAUBmEqA75AExjzt+XACfku4OHFxdc
+9SbC+D9hRkk2S5Xt5A==
+-----END CERTIFICATE REQUEST-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/client.key b/java/socketd-transport-test/src/test/resources/ssl/ca/client.key
new file mode 100644
index 0000000000000000000000000000000000000000..b5cac760a2d11d3f3a5dfc0ee0afe6c05be652f6
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/client.key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/client.pem b/java/socketd-transport-test/src/test/resources/ssl/ca/client.pem
new file mode 100644
index 0000000000000000000000000000000000000000..20cde98c60060c06b65eb306a6686188bd2cd236
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/client.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+sykZGEwIWilrL39xo49BS3lEuDdXkKI=
+-----END PRIVATE KEY-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/gen_ca.sh b/java/socketd-transport-test/src/test/resources/ssl/ca/gen_ca.sh
new file mode 100755
index 0000000000000000000000000000000000000000..20c09e13da6ecaa434685c9e43186ff4d4d759ea
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/gen_ca.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+## reference https://stackoverflow.com/questions/37714558/how-to-enable-server-side-ssl-for-grpc
+echo Generate CA key:
+openssl genrsa -passout pass:123456 -des3 -out ca.key 4096
+
+echo Generate CA certificate:
+openssl req -passin pass:123456 -new -x509 -days 365000 -key ca.key -out ca.crt -subj "/CN=*.hasor.net"
+
+echo Generate server key:
+openssl genrsa -passout pass:123456 -des3 -out server.key 4096
+
+echo Generate server signing request:
+openssl req -passin pass:123456 -new -key server.key -out server.csr -subj "/CN=*.hasor.net"
+
+echo Self-sign server certificate:
+openssl x509 -req -passin pass:123456 -days 365000 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
+
+echo Remove passphrase from server key:
+openssl rsa -passin pass:123456 -in server.key -out server.key
+
+# 单向认证,client不需要生成秘钥和证书,只要提供的 CA 证书即可
+echo Generate client key
+openssl genrsa -passout pass:123456 -des3 -out client.key 4096
+
+echo Generate client signing request:
+openssl req -passin pass:123456 -new -key client.key -out client.csr -subj "/CN=localhost"
+
+echo Self-sign client certificate:
+openssl x509 -passin pass:123456 -req -days 365000 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
+
+echo Remove passphrase from client key:
+openssl rsa -passin pass:123456 -in client.key -out client.key
+
+echo Generate client pem file
+openssl pkcs8 -topk8 -nocrypt -in client.key -out client.pem
+echo Generate server pem file
+openssl pkcs8 -topk8 -nocrypt -in server.key -out server.pem
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/server.crt b/java/socketd-transport-test/src/test/resources/ssl/ca/server.crt
new file mode 100644
index 0000000000000000000000000000000000000000..915fd10b210fa4cd571d4a23d1aaddf9dae484e5
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/server.crt
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEojCCAooCAQEwDQYJKoZIhvcNAQELBQAwFjEUMBIGA1UEAwwLKi5oYXNvci5u
+ZXQwIBcNMjQwMTIwMDUwMDIzWhgPMzAyMzA1MjMwNTAwMjNaMBYxFDASBgNVBAMM
+CyouaGFzb3IubmV0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2OV7
+MkwAsbEMo97GytJL84bJZQEv8U7DXbayQupK236nYePdtnx9swZubWN1XbR8w+ri
+aY2S04ku8eP8z9/ldX6KiJ9oAmdYFoAF0pNDx47ZhEaHEDyPtccn8IpHj5mMtL5+
+d07jf+0YH8SOhDJXCWR8c+k+srDMsZnP6yP4+FFRJq/BOn+xwxg1L+yA2d9Qsir3
+1MKkfP68Qd7zOgDYz4t4o7EJvEyFePTJjbIOzo9d8EiR3lUpKlhE2/bKf7Up8WsK
+zJySOYGWAHnqrE43L9fzXhkGGwrvyCHmklxZ8IAGnqZ5Lj6XYhKJX1z+wcbYMjzs
+X2bH5tIqUyGh/zsV9MExSzhW5iXAZMfzlZZizRRKliaItWEwmN7mpvond630WYkR
+8My0nVlabQrvPxNv8P7iVa6YliDfpFR1WHSbwmRsxV+J42Ap8jyyOjneU5dztQxU
+bfRUCpVMQaz0X6SrY6t0JYiwJM0nHip8W+5eA/EBaG4Xcj9ieLkKnYaABjpG3TMg
+7+wPmLwqtXlCMjVtY+vWWTkvmuTPh2+y8Z4s0pwNan5WQRU3SZKAU2xi24VfJwr8
+AkiTRzZ9gLCWMu38C5iY1p75AGUXyhynO1cJdcGB3G8uPlzw0s/6Bimr1LmKHrd+
+G55OaqLtQZVoSdsgbQXNVK95JsaZ5SEjasOhqMECAwEAATANBgkqhkiG9w0BAQsF
+AAOCAgEAWc6SrlxgV2fqllmOq14zBMytyj9s4mny5FNPfUbgh08bXmoAAIiODhUj
+qaJFpweC59Od6kl0PuFgHhQDdsc6xTvP8WvSXoyCad/en6uJdzG+4Cp0AxcIiETd
+HmMY0WW51k5p6m7dshPbBpWZ4ESMmRhMO/A+G44KaFM4/lQSalRrTvZjVkF+GlV0
+dQbIP1/oVmuJIQGCmPxs062UHxSUM+XG0XstBZ+y66X1irOb2N6uHzZhBngYIaWy
+IU8+IUxO9TVcbyo7zUuydE25qKrrW0A+Zeb6OSQZa9olnKJAU8KZh2Qz2u3tUAiY
+TxkEi/IsADUNj5Oqfe/FcYXwWQjZj1ZJaztudoWqeXv8iGQOBsAsTSpvxi20TOil
+HtIn10UoPTc6gIM/x/2JJu8xQ0NiAAy8g23KxJqBkGiHrfdyVxo0kBQpnSxnQjO+
+hO8zeYDbnAzINzsyjYlSdif+4ZtVdDJSUVvN3P1h6DbPZCHs+86gb9FVIQBZsN0I
+appZbXqO/QgyzfVn0d6512dGEkeDHh8rCZZjbTehiWvD0v4iWqzfb8DxJMauIslD
+na0afd2ZPeAWQFq9PIfk/xUc7BXW4XtnE0T6y57+gJy1OwfZSKKcM0KrsUYKQKku
+UsqztUB8OPIKKeUJtefxE9q5BDjfih+3O6fjl7ritqol52BW1O4=
+-----END CERTIFICATE-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/server.csr b/java/socketd-transport-test/src/test/resources/ssl/ca/server.csr
new file mode 100644
index 0000000000000000000000000000000000000000..cd332858fe8a83baeea14157b348be232bc0f0db
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/server.csr
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEWzCCAkMCAQAwFjEUMBIGA1UEAwwLKi5oYXNvci5uZXQwggIiMA0GCSqGSIb3
+DQEBAQUAA4ICDwAwggIKAoICAQDY5XsyTACxsQyj3sbK0kvzhsllAS/xTsNdtrJC
+6krbfqdh4922fH2zBm5tY3VdtHzD6uJpjZLTiS7x4/zP3+V1foqIn2gCZ1gWgAXS
+k0PHjtmERocQPI+1xyfwikePmYy0vn53TuN/7RgfxI6EMlcJZHxz6T6ysMyxmc/r
+I/j4UVEmr8E6f7HDGDUv7IDZ31CyKvfUwqR8/rxB3vM6ANjPi3ijsQm8TIV49MmN
+sg7Oj13wSJHeVSkqWETb9sp/tSnxawrMnJI5gZYAeeqsTjcv1/NeGQYbCu/IIeaS
+XFnwgAaepnkuPpdiEolfXP7BxtgyPOxfZsfm0ipTIaH/OxX0wTFLOFbmJcBkx/OV
+lmLNFEqWJoi1YTCY3uam+id3rfRZiRHwzLSdWVptCu8/E2/w/uJVrpiWIN+kVHVY
+dJvCZGzFX4njYCnyPLI6Od5Tl3O1DFRt9FQKlUxBrPRfpKtjq3QliLAkzSceKnxb
+7l4D8QFobhdyP2J4uQqdhoAGOkbdMyDv7A+YvCq1eUIyNW1j69ZZOS+a5M+Hb7Lx
+nizSnA1qflZBFTdJkoBTbGLbhV8nCvwCSJNHNn2AsJYy7fwLmJjWnvkAZRfKHKc7
+Vwl1wYHcby4+XPDSz/oGKavUuYoet34bnk5qou1BlWhJ2yBtBc1Ur3kmxpnlISNq
+w6GowQIDAQABoAAwDQYJKoZIhvcNAQELBQADggIBABjTPOBpuDmilc/h2SjZKAz/
+EltfxKyF8+HUSFitFViYZA2SYJvcRuyVNwrfDyl/E4Tq4eCcytdQPZDqQ8oU2Wre
+9kFhxQaSlw0eSuW2bmmYfAsvdp5YZZpN0p9B7uSc15MQG4pN86Inoa6H570ugUal
+2TK4uEmNlK2Tw6LJ6M20o4WCi+1zXwwtKT0kS7WIOAZE8raGa4/QlMkZevVf7huI
+iTKxsDaaExQJwczUARftAMLQcr+yWNgAZtdfCGT5paO0RzHlBSeonhSChGxojzxE
++W6DpLEUKFsqxuJGuuuuctxLXsrHHzpUqfoA6VQ9s/2vpYiXz4bibbgD3vd6pPyg
+Mxiwkfd6pQPJPY1wx5OEclfngdz+TQgs7UmAZKJhgddxR1JYfZK+2blzZiXL841n
+4J8kQTCWskYX4eZDkJ1M/hPD4WEK+/hdGkS4pg7JlTZMtbh+oGNDeR8CotORn69g
+7svfFy+lnVXdbhR6CuIVqPbePCf04T4lrRNd1J6MHXbps/W2goYWQ3F3J5VomedO
++G0vSrlGHfXgUOMhuxmvv6fQDf1nwthmluceZv7H+uDDB7OnnM0jebSvqWOfZzXq
+1bIdpFSh2DGJ9+ktACgBOzhQSr6NdLF+UWOQtjCogAXp22hpp1jMYhJuzPADSztU
+t6bApB1XIt8IvOeCITk3
+-----END CERTIFICATE REQUEST-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/server.key b/java/socketd-transport-test/src/test/resources/ssl/ca/server.key
new file mode 100644
index 0000000000000000000000000000000000000000..9c3b50bdd00a0657759a26ebe7e5b238d3e35173
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/server.key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/ca/server.pem b/java/socketd-transport-test/src/test/resources/ssl/ca/server.pem
new file mode 100644
index 0000000000000000000000000000000000000000..a7b5380558d8fb591b7ad510d978bfce16bfd8e3
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/ca/server.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+2tXsl194s9W5Aloj40e9rFmCvzJ9DEaW
+-----END PRIVATE KEY-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/jks/gen_jks.sh b/java/socketd-transport-test/src/test/resources/ssl/jks/gen_jks.sh
new file mode 100755
index 0000000000000000000000000000000000000000..73f9bf73e545747e9a23485df4687b79a8b7a800
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/jks/gen_jks.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+echo Generate JKS:
+
+echo 'keyPass 123456'
+echo 'storepass 123456'
+
+# gen KeyPair
+keytool -genkeypair -alias certificateKey -keypass 123456 -storepass 123456 -keyalg RSA -validity 36500 -keystore keystore.jks
+
+# export public CER
+keytool -export -alias certificateKey -storepass 123456 -keystore keystore.jks -rfc -file public.crt
+
+# gen Truststore, and import public CRT
+Keytool -import -alias certificateKey -storepass 123456 -noprompt -file public.crt -keystore trustKeystore.jks
+
+# list trustKeystore
+keytool -list -v -storepass 123456 -keystore trustKeystore.jks
\ No newline at end of file
diff --git a/java/socketd-transport-test/src/test/resources/ssl/jks/keystore.jks b/java/socketd-transport-test/src/test/resources/ssl/jks/keystore.jks
new file mode 100644
index 0000000000000000000000000000000000000000..6e713eb89814317e42a3f8ee6c17907c5f7e977a
Binary files /dev/null and b/java/socketd-transport-test/src/test/resources/ssl/jks/keystore.jks differ
diff --git a/java/socketd-transport-test/src/test/resources/ssl/jks/public.crt b/java/socketd-transport-test/src/test/resources/ssl/jks/public.crt
new file mode 100644
index 0000000000000000000000000000000000000000..69d595239ad0267793cf6a718087db5222c99fa0
--- /dev/null
+++ b/java/socketd-transport-test/src/test/resources/ssl/jks/public.crt
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDeTCCAmGgAwIBAgIEVTiHlDANBgkqhkiG9w0BAQsFADBsMRAwDgYDVQQGEwdV
+bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+VQQKEwdVbmtub3duMRAwDgYDVQQLEwdVbmtub3duMRAwDgYDVQQDEwdVbmtub3du
+MCAXDTI0MDEyMDA1MTIyMFoYDzIxMjMxMjI3MDUxMjIwWjBsMRAwDgYDVQQGEwdV
+bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+VQQKEwdVbmtub3duMRAwDgYDVQQLEwdVbmtub3duMRAwDgYDVQQDEwdVbmtub3du
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAteS8hen5UuZoJZc3IZfO
+/NcR5Dv5cXBy6ebuePVIGOteR8HTL6bZ98mpEwVqFEFBIemAaHsL2T8qs76cKtLO
+VZmH6FMyzgDMQ+oJcBc9DOQTxxYB1jzQkupynihtbOZS1y1f9YvV36W6mtNAA4VE
+noxlS38vpUnqGlde4MA0hO5MtwIzRAbv+3H9I1VM6m+WuLeS3f5j6yYdm8fcHRiN
+A3shuCDFRU6Bw/yStl5Z/omueg6CFF9ZrNmSAvetg5FVWOjLYm4oVoQjltk4CIoA
+MHLBP5OvNo2PgVrzj8y6aTLFAGZJSXvQBzLL2RKX1twhtuD51Ids1LEdzakgcjB2
+NQIDAQABoyEwHzAdBgNVHQ4EFgQUoHktJZ7RSvElHnhJsnz1uyKzkpwwDQYJKoZI
+hvcNAQELBQADggEBAHY0fgpME02yYhk57xTqJtTmNjGe1+HmvW5O6Fp9T/n1X+zZ
+b3g+IaZNm6T3PljHdWVdAL1Vf0y0CZKpz5sC1cfhDbeJIcfF+jswR3PZAHWRKQD1
+8beRoUbQ+eN7Do2rFHSsSWFYX151R+rUPt6NrZsMpodz8vSXeb6wSgt6PPzTHIgb
+Mkfe2yHAf6hoLkUqhTFoYcNnakQe/be+AWxumsyz0vXdxX1V9L21mdMjHJC4NIsB
+StsVXonHs+AKCVD7Nr8QF5O2ra1fhdyI33dDsQCOjmWkZu/1lrYGHnk/E/H9Sv+o
+qhs9IEI0u/sS9k53kTVrwvKrhUl4Wq/V1DwOjmc=
+-----END CERTIFICATE-----
diff --git a/java/socketd-transport-test/src/test/resources/ssl/jks/trustKeystore.jks b/java/socketd-transport-test/src/test/resources/ssl/jks/trustKeystore.jks
new file mode 100644
index 0000000000000000000000000000000000000000..1b2dc83a23bacef05746646bb15d73df20ecd7d9
Binary files /dev/null and b/java/socketd-transport-test/src/test/resources/ssl/jks/trustKeystore.jks differ
diff --git a/java/socketd-transport/socketd-transport-neta/pom.xml b/java/socketd-transport/socketd-transport-neta/pom.xml
index 767d4fd3da353e219ead9fce4d66c79c2a02f5fa..5b1f118eef10ae59727608b27a2faf91af75ca3d 100644
--- a/java/socketd-transport/socketd-transport-neta/pom.xml
+++ b/java/socketd-transport/socketd-transport-neta/pom.xml
@@ -28,7 +28,7 @@
net.hasor
neta-all
- 1.0.5
+ 1.1.0
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/BasedPipeHandler.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/BasedPipeHandler.java
similarity index 92%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/BasedPipeHandler.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/BasedPipeHandler.java
index e9068b1cd5fa8dda2546669281035d43254534c6..1ed3745a8a09b9e402af1a50a2263e0ed86cd975 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/BasedPipeHandler.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/BasedPipeHandler.java
@@ -1,8 +1,8 @@
-package org.noear.socketd.transport.neta.tcp.impl;
+package org.noear.socketd.transport.neta.codec;
import net.hasor.neta.channel.NetChannel;
import net.hasor.neta.channel.ProtoContext;
-import net.hasor.neta.handler.ProtoHandler;
+import net.hasor.neta.channel.ProtoHandler;
import org.noear.socketd.transport.core.ChannelInternal;
import org.noear.socketd.transport.core.ChannelSupporter;
import org.noear.socketd.transport.core.Config;
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ByteBufCodecReader.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/ByteBufCodecReader.java
similarity index 95%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ByteBufCodecReader.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/ByteBufCodecReader.java
index afd337eef944a2fc209f834ab7f16f07cf57ea25..5311ac2a6db8b5e5325e8f850a99a8d6fc9c17da 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ByteBufCodecReader.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/ByteBufCodecReader.java
@@ -1,4 +1,4 @@
-package org.noear.socketd.transport.neta.tcp.impl;
+package org.noear.socketd.transport.neta.codec;
import net.hasor.neta.bytebuf.ByteBuf;
import org.noear.socketd.transport.core.CodecReader;
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ByteBufCodecWriter.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/ByteBufCodecWriter.java
similarity index 93%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ByteBufCodecWriter.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/ByteBufCodecWriter.java
index aaa0399897db0ff49805e9f8f91f6c683f370912..1ef52fd4445545af5f6bfa86147ecaee69ad1cfd 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ByteBufCodecWriter.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/ByteBufCodecWriter.java
@@ -1,4 +1,4 @@
-package org.noear.socketd.transport.neta.tcp.impl;
+package org.noear.socketd.transport.neta.codec;
import net.hasor.neta.bytebuf.ByteBuf;
import org.noear.socketd.transport.core.CodecWriter;
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/FrameDecoder.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/FrameDecoder.java
similarity index 74%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/FrameDecoder.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/FrameDecoder.java
index 4d7740bca3fefc7087f21e294dc89c083f5e9dd6..6074af2fc6d8335e71227f55cc148307ccfe3973 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/FrameDecoder.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/FrameDecoder.java
@@ -1,11 +1,7 @@
-package org.noear.socketd.transport.neta.tcp.impl;
+package org.noear.socketd.transport.neta.codec;
import net.hasor.neta.bytebuf.ByteBuf;
-import net.hasor.neta.channel.NetChannel;
-import net.hasor.neta.channel.ProtoContext;
-import net.hasor.neta.handler.ProtoRcvQueue;
-import net.hasor.neta.handler.ProtoSndQueue;
-import net.hasor.neta.handler.ProtoStatus;
+import net.hasor.neta.channel.*;
import org.noear.socketd.transport.core.ChannelSupporter;
import org.noear.socketd.transport.core.Config;
import org.noear.socketd.transport.core.Frame;
@@ -34,6 +30,6 @@ public class FrameDecoder extends BasedPipeHandler {
hasAny = true;
}
- return hasAny ? ProtoStatus.Next : ProtoStatus.Skip;
+ return hasAny ? ProtoStatus.Next : ProtoStatus.Stop;
}
}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/FrameEncoder.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/FrameEncoder.java
similarity index 78%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/FrameEncoder.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/FrameEncoder.java
index e2e59ed6ea0785fe3c077066a7fdd447b29c09c9..71a8b4b59bf617e24cde405711a29d4359cc91cc 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/FrameEncoder.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/codec/FrameEncoder.java
@@ -1,12 +1,8 @@
-package org.noear.socketd.transport.neta.tcp.impl;
+package org.noear.socketd.transport.neta.codec;
import net.hasor.neta.bytebuf.ByteBuf;
import net.hasor.neta.bytebuf.ByteBufAllocator;
-import net.hasor.neta.channel.NetChannel;
-import net.hasor.neta.channel.ProtoContext;
-import net.hasor.neta.handler.ProtoRcvQueue;
-import net.hasor.neta.handler.ProtoSndQueue;
-import net.hasor.neta.handler.ProtoStatus;
+import net.hasor.neta.channel.*;
import org.noear.socketd.transport.core.ChannelSupporter;
import org.noear.socketd.transport.core.Config;
import org.noear.socketd.transport.core.Frame;
@@ -40,6 +36,6 @@ public class FrameEncoder extends BasedPipeHandler {
hasAny = true;
}
}
- return hasAny ? ProtoStatus.Next : ProtoStatus.Skip;
+ return hasAny ? ProtoStatus.Next : ProtoStatus.Stop;
}
}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ClientPipeListener.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/listener/ClientListener.java
similarity index 43%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ClientPipeListener.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/listener/ClientListener.java
index 02c567c7702a57d9593a8bd39ecc67493e8c1136..df5edb659eae97cf5c96182c109a43ebb00debf1 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ClientPipeListener.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/listener/ClientListener.java
@@ -1,12 +1,15 @@
-package org.noear.socketd.transport.neta.tcp.impl;
+package org.noear.socketd.transport.neta.listener;
-import net.hasor.neta.channel.NetChannel;
-import net.hasor.neta.channel.ProtoContext;
+import net.hasor.neta.channel.PlayLoad;
+import net.hasor.neta.channel.PlayLoadListener;
import net.hasor.neta.channel.SoCloseException;
import net.hasor.neta.channel.SoTimeoutException;
-import net.hasor.neta.handler.*;
import org.noear.socketd.transport.client.ClientHandshakeResult;
-import org.noear.socketd.transport.core.*;
+import org.noear.socketd.transport.client.ClientInternal;
+import org.noear.socketd.transport.core.ChannelInternal;
+import org.noear.socketd.transport.core.Flags;
+import org.noear.socketd.transport.core.Frame;
+import org.noear.socketd.transport.core.Processor;
import java.util.concurrent.CompletableFuture;
@@ -14,11 +17,11 @@ import java.util.concurrent.CompletableFuture;
* @author noear
* @since 2.3
*/
-public class ClientPipeListener implements ProtoHandler {
+public class ClientListener implements PlayLoadListener {
private final Processor processor;
private final CompletableFuture handshakeFuture = new CompletableFuture<>();
- public ClientPipeListener(ChannelSupporter supporter) {
+ public ClientListener(ClientInternal supporter) {
this.processor = supporter.getProcessor();
}
@@ -27,26 +30,25 @@ public class ClientPipeListener implements ProtoHandler {
}
@Override
- public ProtoStatus onMessage(ProtoContext context, ProtoRcvQueue src, ProtoSndQueue dst) throws Throwable {
- ChannelInternal channel = context.context(ChannelInternal.class);
-
- while (src.hasMore()) {
- Frame frame = src.takeMessage();
- if (frame.flag() == Flags.Connack) {
- channel.onOpenFuture((r, e) -> {
- handshakeFuture.complete(new ClientHandshakeResult(channel, e));
- });
- }
-
- processor.reveFrame(channel, frame);
+ public void onEvent(PlayLoad data) {
+ ChannelInternal channel = data.getSource().findProtoContext(ChannelInternal.class);
+ if (data.isSuccess()) {
+ this.onData(channel, (Frame) data.getData());
+ } else {
+ this.onError(channel, data.getError());
}
- return ProtoStatus.Next;
}
- @Override
- public ProtoStatus onError(ProtoContext context, Throwable e, ProtoExceptionHolder eh) throws Throwable {
- ChannelInternal channel = context.context(ChannelInternal.class);
+ private void onData(ChannelInternal channel, Frame frame) {
+ if (frame.flag() == Flags.Connack) {
+ channel.onOpenFuture((r, e) -> {
+ handshakeFuture.complete(new ClientHandshakeResult(channel, e));
+ });
+ }
+ processor.reveFrame(channel, frame);
+ }
+ public void onError(ChannelInternal channel, Throwable e) {
if (e instanceof SoCloseException) {
processor.onClose(channel);
} else if (e instanceof SoTimeoutException) {
@@ -54,7 +56,5 @@ public class ClientPipeListener implements ProtoHandler {
} else {
processor.onError(channel, e);
}
-
- return ProtoStatus.Next;
}
}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ServerPipeListener.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/listener/ServerListener.java
similarity index 38%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ServerPipeListener.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/listener/ServerListener.java
index e1d6a5c4276365d98d5e9e192b3f4512a0537d22..6f2c82133c1a0e186ae5e2f47e2d85f006afb757 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/impl/ServerPipeListener.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/listener/ServerListener.java
@@ -1,43 +1,37 @@
-package org.noear.socketd.transport.neta.tcp.impl;
+package org.noear.socketd.transport.neta.listener;
-import net.hasor.neta.channel.NetChannel;
-import net.hasor.neta.channel.ProtoContext;
-import net.hasor.neta.channel.SoCloseException;
-import net.hasor.neta.channel.SoTimeoutException;
-import net.hasor.neta.handler.*;
+import net.hasor.neta.channel.*;
import org.noear.socketd.transport.core.ChannelInternal;
import org.noear.socketd.transport.core.ChannelSupporter;
import org.noear.socketd.transport.core.Frame;
import org.noear.socketd.transport.core.Processor;
-import java.util.Objects;
-
/**
* @author noear
* @since 2.3
*/
-public class ServerPipeListener implements ProtoHandler {
+public class ServerListener implements PlayLoadListener {
private final Processor processor;
- public ServerPipeListener(ChannelSupporter supporter) {
+ public ServerListener(ChannelSupporter supporter) {
this.processor = supporter.getProcessor();
}
@Override
- public ProtoStatus onMessage(ProtoContext context, ProtoRcvQueue src, ProtoSndQueue dst) throws Throwable {
- ChannelInternal channel = context.context(ChannelInternal.class);
-
- while (src.hasMore()) {
- processor.reveFrame(channel, src.takeMessage());
+ public void onEvent(PlayLoad data) {
+ ChannelInternal channel = data.getSource().findProtoContext(ChannelInternal.class);
+ if (data.isSuccess()) {
+ this.onData(channel, (Frame) data.getData());
+ } else {
+ this.onError(channel, data.getError());
}
-
- return ProtoStatus.Next;
}
- @Override
- public ProtoStatus onError(ProtoContext context, Throwable e, ProtoExceptionHolder eh) throws Throwable {
- ChannelInternal channel = Objects.requireNonNull(context.context(ChannelInternal.class));
+ private void onData(ChannelInternal channel, Frame src) {
+ processor.reveFrame(channel, src);
+ }
+ private void onError(ChannelInternal channel, Throwable e) {
if (e instanceof SoCloseException) {
processor.onClose(channel);
} else if (e instanceof SoTimeoutException) {
@@ -45,7 +39,5 @@ public class ServerPipeListener implements ProtoHandler {
} else {
processor.onError(channel, e);
}
-
- return ProtoStatus.Next;
}
}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioChannelAssistant.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioChannelAssistant.java
similarity index 89%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioChannelAssistant.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioChannelAssistant.java
index f45deea626807cff0e5a30addd812761482377a8..10caa52f861aa7f46700f011aaa8646147885617 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioChannelAssistant.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioChannelAssistant.java
@@ -1,4 +1,4 @@
-package org.noear.socketd.transport.neta.tcp;
+package org.noear.socketd.transport.neta.socket;
import net.hasor.neta.channel.NetChannel;
import org.noear.socketd.transport.core.ChannelAssistant;
@@ -13,7 +13,7 @@ import java.net.InetSocketAddress;
* @author noear
* @since 2.3
*/
-public class TcpAioChannelAssistant implements ChannelAssistant {
+public class AioChannelAssistant implements ChannelAssistant {
@Override
public void write(NetChannel target, Frame frame, ChannelInternal channel, IoCompletionHandler completionHandler) {
try {
@@ -40,12 +40,12 @@ public class TcpAioChannelAssistant implements ChannelAssistant {
}
@Override
- public InetSocketAddress getRemoteAddress(NetChannel target) throws IOException {
+ public InetSocketAddress getRemoteAddress(NetChannel target) {
return (InetSocketAddress) target.getRemoteAddr();
}
@Override
- public InetSocketAddress getLocalAddress(NetChannel target) throws IOException {
+ public InetSocketAddress getLocalAddress(NetChannel target) {
return (InetSocketAddress) target.getLocalAddr();
}
}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioClient.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioClient.java
similarity index 36%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioClient.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioClient.java
index 6b08241f4561d657b62413ba9705cb14909b756c..06aed17d37fab2e35d3ec1924c135e27b61b1e47 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioClient.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioClient.java
@@ -1,22 +1,16 @@
-package org.noear.socketd.transport.neta.tcp;
+package org.noear.socketd.transport.neta.socket;
import net.hasor.neta.channel.NetChannel;
import org.noear.socketd.transport.client.ClientBase;
import org.noear.socketd.transport.client.ClientConfig;
-import org.noear.socketd.transport.client.ClientConnector;
import org.noear.socketd.transport.core.ChannelSupporter;
/**
* @author noear
* @since 2.3
*/
-public class TcpAioClient extends ClientBase implements ChannelSupporter {
- public TcpAioClient(ClientConfig clientConfig) {
- super(clientConfig, new TcpAioChannelAssistant());
- }
-
- @Override
- protected ClientConnector createConnector() {
- return new TcpAioClientConnector(this);
+public abstract class AioClient extends ClientBase implements ChannelSupporter {
+ public AioClient(ClientConfig clientConfig) {
+ super(clientConfig, new AioChannelAssistant());
}
}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioClientConfig.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioClientConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..ace99eeed913b8a75156f86eff02bfde0cce1c57
--- /dev/null
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioClientConfig.java
@@ -0,0 +1,35 @@
+package org.noear.socketd.transport.neta.socket;
+
+import net.hasor.neta.channel.SoConfig;
+import net.hasor.neta.handler.codec.ssl.SslConfig;
+import org.noear.socketd.transport.client.ClientConfig;
+
+/**
+ * @author noear
+ * @since 2.3
+ */
+public class AioClientConfig extends ClientConfig {
+
+ private SoConfig soConfig = null;
+ private SslConfig sslConfig = null;
+
+ public AioClientConfig(String schema) {
+ super(schema);
+ }
+
+ public SoConfig getSoConfig() {
+ return soConfig;
+ }
+
+ public void setSoConfig(SoConfig soConfig) {
+ this.soConfig = soConfig;
+ }
+
+ public SslConfig getSslConfig() {
+ return sslConfig;
+ }
+
+ public void setSslConfig(SslConfig sslConfig) {
+ this.sslConfig = sslConfig;
+ }
+}
\ No newline at end of file
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioClientConnector.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioClientConnector.java
similarity index 60%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioClientConnector.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioClientConnector.java
index d5b8cbd2905970979b9323b9b88954cc748942c3..0e8f1d89ab982be24058ca69b078dc977855ce16 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioClientConnector.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioClientConnector.java
@@ -1,24 +1,21 @@
-package org.noear.socketd.transport.neta.tcp;
+package org.noear.socketd.transport.neta.socket;
import net.hasor.cobble.concurrent.future.Future;
-import net.hasor.neta.channel.NetChannel;
-import net.hasor.neta.channel.NetManager;
-import net.hasor.neta.channel.ProtoInitializer;
-import net.hasor.neta.channel.SoConfig;
-import net.hasor.neta.handler.ProtoHelper;
+import net.hasor.neta.channel.*;
import net.hasor.neta.handler.codec.LengthFieldBasedFrameHandler;
import org.noear.socketd.exception.SocketDConnectionException;
import org.noear.socketd.transport.client.ClientConnectorBase;
import org.noear.socketd.transport.client.ClientHandshakeResult;
import org.noear.socketd.transport.core.ChannelInternal;
import org.noear.socketd.transport.core.Constants;
-import org.noear.socketd.transport.neta.tcp.impl.ClientPipeListener;
-import org.noear.socketd.transport.neta.tcp.impl.FrameDecoder;
-import org.noear.socketd.transport.neta.tcp.impl.FrameEncoder;
+import org.noear.socketd.transport.neta.codec.FrameDecoder;
+import org.noear.socketd.transport.neta.codec.FrameEncoder;
+import org.noear.socketd.transport.neta.listener.ClientListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
+import java.net.InetSocketAddress;
import java.nio.ByteOrder;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -27,35 +24,44 @@ import java.util.concurrent.TimeoutException;
* @author noear
* @since 2.3
*/
-public class TcpAioClientConnector extends ClientConnectorBase {
- private static final Logger log = LoggerFactory.getLogger(TcpAioClientConnector.class);
+public abstract class AioClientConnector extends ClientConnectorBase {
+ private static final Logger log = LoggerFactory.getLogger(AioClientConnector.class);
private NetManager real;
- public TcpAioClientConnector(TcpAioClient client) {
+ public AioClientConnector(AioClient client) {
super(client);
}
+ protected abstract Future connectTo(NetManager neta, InetSocketAddress remoteAddr, ProtoInitializer initializer);
+
@Override
public ChannelInternal connect() throws IOException {
//关闭之前的资源
close();
- FrameDecoder decoder = new FrameDecoder(client.getConfig(), client);
- FrameEncoder encoder = new FrameEncoder(client.getConfig(), client);
- ClientPipeListener pipeListener = new ClientPipeListener(client);
-
- ProtoInitializer initializer = ctx -> ProtoHelper.builder()//
- .nextDecoder(new LengthFieldBasedFrameHandler(0, ByteOrder.BIG_ENDIAN, 4, 0, -4, Constants.MAX_SIZE_FRAME))//
- .nextDuplex(decoder, encoder)//
- .nextDecoder(pipeListener).build();
+ ClientListener pipeListener = new ClientListener(client);
+ InetSocketAddress remoteAddr = new InetSocketAddress(getConfig().getHost(), getConfig().getPort());
+ NetConfig netConfig = new NetConfig();
- SoConfig soConfig = new SoConfig();
- soConfig.setNetlog(true);
- real = new NetManager(soConfig);
+ netConfig.setPrintLog(true);
+ real = new NetManager(netConfig);
+ real.subscribe(PlayLoad::isInbound, pipeListener);
try {
- Future connect = real.connect(getConfig().getHost(), getConfig().getPort(), initializer);
+ Future connect = this.connectTo(this.real, remoteAddr, ctx -> {
+ // ssl
+ if (AioSslHelper.isUsingSSL(getConfig())) {
+ ctx.addLast("SSL", AioSslHelper.createSSL(getConfig()));
+ }
+ // frame
+ ctx.addLastDecoder("Frame", new LengthFieldBasedFrameHandler(0, ByteOrder.BIG_ENDIAN, 4, 0, -4, Constants.MAX_SIZE_FRAME));
+ // codec
+ FrameDecoder decoder = new FrameDecoder(client.getConfig(), client);
+ FrameEncoder encoder = new FrameEncoder(client.getConfig(), client);
+ ctx.addLast("Socket.D", decoder, encoder);
+ });
+
connect.onCompleted(f -> {
//开始握手
ChannelInternal channel = f.getResult().findProtoContext(ChannelInternal.class);
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioServer.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioServer.java
similarity index 44%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioServer.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioServer.java
index 036942acd2b1d6094cf3700391efac4328d951ba..abf12e98975825e736e157e96189e1d0d018f010 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioServer.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioServer.java
@@ -1,17 +1,12 @@
-package org.noear.socketd.transport.neta.tcp;
+package org.noear.socketd.transport.neta.socket;
-import net.hasor.neta.channel.NetChannel;
-import net.hasor.neta.channel.NetManager;
-import net.hasor.neta.channel.ProtoInitializer;
-import net.hasor.neta.channel.SoConfig;
-import net.hasor.neta.handler.ProtoHelper;
+import net.hasor.neta.channel.*;
import net.hasor.neta.handler.codec.LengthFieldBasedFrameHandler;
-import org.noear.socketd.SocketD;
import org.noear.socketd.transport.core.ChannelSupporter;
import org.noear.socketd.transport.core.Constants;
-import org.noear.socketd.transport.neta.tcp.impl.FrameDecoder;
-import org.noear.socketd.transport.neta.tcp.impl.FrameEncoder;
-import org.noear.socketd.transport.neta.tcp.impl.ServerPipeListener;
+import org.noear.socketd.transport.neta.codec.FrameDecoder;
+import org.noear.socketd.transport.neta.codec.FrameEncoder;
+import org.noear.socketd.transport.neta.listener.ServerListener;
import org.noear.socketd.transport.server.Server;
import org.noear.socketd.transport.server.ServerBase;
import org.noear.socketd.transport.server.ServerConfig;
@@ -20,24 +15,22 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
+import java.net.InetSocketAddress;
import java.nio.ByteOrder;
/**
* @author noear
* @since 2.3
*/
-public class TcpAioServer extends ServerBase implements ChannelSupporter {
- private static final Logger log = LoggerFactory.getLogger(TcpAioServer.class);
+public abstract class AioServer extends ServerBase implements ChannelSupporter {
+ private static final Logger log = LoggerFactory.getLogger(AioServer.class);
private NetManager server;
- public TcpAioServer(ServerConfig config) {
- super(config, new TcpAioChannelAssistant());
+ public AioServer(ServerConfig config) {
+ super(config, new AioChannelAssistant());
}
- @Override
- public String getTitle() {
- return "tcp/aio/neta 1.0/" + SocketD.version();
- }
+ protected abstract NetListen bindTo(NetManager neta, InetSocketAddress bindAddr, ProtoInitializer initializer) throws IOException;
@Override
public Server start() throws IOException {
@@ -47,25 +40,24 @@ public class TcpAioServer extends ServerBase implements
isStarted = true;
}
- FrameDecoder decoder = new FrameDecoder(this.getConfig(), this);
- FrameEncoder encoder = new FrameEncoder(this.getConfig(), this);
- ServerPipeListener listener = new ServerPipeListener(this);
-
- ProtoInitializer initializer = ctx -> ProtoHelper.builder()//
- .nextDecoder(new LengthFieldBasedFrameHandler(0, ByteOrder.BIG_ENDIAN, 4, 0, -4, Constants.MAX_SIZE_FRAME))//
- .nextDuplex(decoder, encoder)//
- .nextDecoder(listener).build();
-
- SoConfig soConfig = new SoConfig();
- soConfig.setSoKeepAlive(false);
- soConfig.setNetlog(true);
- server = new NetManager(soConfig);
+ InetSocketAddress bindAddr = StrUtils.isEmpty(getConfig().getHost()) ? new InetSocketAddress(getConfig().getPort()) : new InetSocketAddress(getConfig().getHost(), getConfig().getPort());
+ NetConfig netConfig = new NetConfig();
+ netConfig.setPrintLog(true);
- if (StrUtils.isEmpty(getConfig().getHost())) {
- server.listen(getConfig().getPort(), initializer);
- } else {
- server.listen(getConfig().getHost(), getConfig().getPort(), initializer);
- }
+ server = new NetManager(netConfig);
+ server.subscribe(PlayLoad::isInbound, new ServerListener(this));
+ this.bindTo(this.server, bindAddr, ctx -> {
+ // ssl
+ if (AioSslHelper.isUsingSSL(getConfig())) {
+ ctx.addLast("SSL", AioSslHelper.createSSL(getConfig()));
+ }
+ // frame
+ ctx.addLastDecoder(new LengthFieldBasedFrameHandler(0, ByteOrder.BIG_ENDIAN, 4, 0, -4, Constants.MAX_SIZE_FRAME));
+ // codec
+ FrameDecoder decoder = new FrameDecoder(this.getConfig(), this);
+ FrameEncoder encoder = new FrameEncoder(this.getConfig(), this);
+ ctx.addLast(decoder, encoder);
+ });
log.info("Socket.D server started: {server=" + getConfig().getLocalUrl() + "}");
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioServerConfig.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioServerConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..29ed697b3034f2f7de153330630b53bc8298ac5e
--- /dev/null
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioServerConfig.java
@@ -0,0 +1,35 @@
+package org.noear.socketd.transport.neta.socket;
+
+import net.hasor.neta.channel.SoConfig;
+import net.hasor.neta.handler.codec.ssl.SslConfig;
+import org.noear.socketd.transport.server.ServerConfig;
+
+/**
+ * @author noear
+ * @since 2.3
+ */
+public class AioServerConfig extends ServerConfig {
+
+ private SoConfig soConfig = null;
+ private SslConfig sslConfig = null;
+
+ public AioServerConfig(String schema) {
+ super(schema);
+ }
+
+ public SoConfig getSoConfig() {
+ return soConfig;
+ }
+
+ public void setSoConfig(SoConfig soConfig) {
+ this.soConfig = soConfig;
+ }
+
+ public SslConfig getSslConfig() {
+ return sslConfig;
+ }
+
+ public void setSslConfig(SslConfig sslConfig) {
+ this.sslConfig = sslConfig;
+ }
+}
\ No newline at end of file
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioSslHelper.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioSslHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3fe35920f1ca6428bc7633b31c90118571d426f
--- /dev/null
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/AioSslHelper.java
@@ -0,0 +1,71 @@
+package org.noear.socketd.transport.neta.socket;
+
+import net.hasor.neta.bytebuf.ByteBuf;
+import net.hasor.neta.channel.ProtoDuplexer;
+import net.hasor.neta.handler.codec.ssl.SslConfig;
+import net.hasor.neta.handler.codec.ssl.SslProtoDuplex;
+import org.noear.socketd.transport.client.ClientConfig;
+import org.noear.socketd.transport.server.ServerConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Objects;
+
+/**
+ * @author noear
+ * @since 2.3
+ */
+class AioSslHelper {
+ private static final Logger log = LoggerFactory.getLogger(AioSslHelper.class);
+
+ public static boolean isUsingSSL(ServerConfig config) {
+ if (config.getSslContext() != null) {
+ return true;
+ } else if (config instanceof AioServerConfig) {
+ SslConfig sslConfig = ((AioServerConfig) config).getSslConfig();
+ return sslConfig != null;
+ } else {
+ return false;
+ }
+ }
+
+ public static boolean isUsingSSL(ClientConfig config) {
+ if (config.getSslContext() != null) {
+ return true;
+ } else if (config instanceof AioClientConfig) {
+ SslConfig sslConfig = ((AioClientConfig) config).getSslConfig();
+ return sslConfig != null;
+ } else {
+ return false;
+ }
+ }
+
+ public static ProtoDuplexer createSSL(ServerConfig config) {
+ SslConfig sslConfig;
+ if (config.getSslContext() != null) {
+ log.info("use sslContext from ServerConfig.");
+ sslConfig = new SslConfig();
+ sslConfig.setSslContext(config.getSslContext());
+ } else if (config instanceof AioServerConfig) {
+ sslConfig = Objects.requireNonNull(((AioServerConfig) config).getSslConfig(), "sslConfig is null");
+ } else {
+ throw new NullPointerException("sslConfig is null");
+ }
+ return new SslProtoDuplex(sslConfig);
+ }
+
+ public static ProtoDuplexer createSSL(ClientConfig config) {
+ SslConfig sslConfig;
+ if (config.getSslContext() != null) {
+ log.info("use sslContext from ClientConfig.");
+ sslConfig = new SslConfig();
+ sslConfig.setSslContext(config.getSslContext());
+ } else if (config instanceof AioClientConfig) {
+ sslConfig = Objects.requireNonNull(((AioClientConfig) config).getSslConfig(), "sslConfig is null");
+ } else {
+ throw new NullPointerException("sslConfig is null");
+ }
+ return new SslProtoDuplex(sslConfig);
+ }
+
+}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/tcp/TcpAioClient.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/tcp/TcpAioClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f8935a66088a4afb96bb5913127a4962fa457b4
--- /dev/null
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/tcp/TcpAioClient.java
@@ -0,0 +1,54 @@
+package org.noear.socketd.transport.neta.socket.tcp;
+
+import net.hasor.cobble.concurrent.future.Future;
+import net.hasor.neta.channel.NetChannel;
+import net.hasor.neta.channel.NetManager;
+import net.hasor.neta.channel.ProtoInitializer;
+import net.hasor.neta.channel.SoConfig;
+import net.hasor.neta.channel.tcp.TcpSoConfig;
+import org.noear.socketd.transport.client.ClientConfig;
+import org.noear.socketd.transport.client.ClientConnector;
+import org.noear.socketd.transport.neta.socket.AioClient;
+import org.noear.socketd.transport.neta.socket.AioClientConfig;
+import org.noear.socketd.transport.neta.socket.AioClientConnector;
+
+import java.net.InetSocketAddress;
+
+/**
+ * @author noear
+ * @since 2.3
+ */
+public class TcpAioClient extends AioClient {
+ public TcpAioClient(ClientConfig clientConfig) {
+ super(clientConfig);
+ }
+
+ @Override
+ protected ClientConnector createConnector() {
+ return new AioClientConnector(this) {
+ @Override
+ protected Future connectTo(NetManager neta, InetSocketAddress remoteAddr, ProtoInitializer initializer) {
+ return tcpConnectTo(neta, remoteAddr, initializer);
+ }
+ };
+ }
+
+ protected Future tcpConnectTo(NetManager neta, InetSocketAddress remoteAddr, ProtoInitializer initializer) {
+ TcpSoConfig soConfig;
+ if (getConfig() instanceof AioClientConfig) {
+ SoConfig config = ((AioClientConfig) getConfig()).getSoConfig();
+ if (config instanceof TcpSoConfig) {
+ soConfig = (TcpSoConfig) config;
+ } else {
+ throw new UnsupportedOperationException("only support TcpSoConfig.");
+ }
+ } else {
+ soConfig = SoConfig.TCP();
+ }
+
+ soConfig.setRcvSlotSize(getConfig().getReadBufferSize());
+ soConfig.setSndSlotSize(getConfig().getWriteBufferSize());
+
+ return neta.connectAsync(remoteAddr, initializer, soConfig);
+ }
+}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioProvider.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/tcp/TcpAioProvider.java
similarity index 94%
rename from java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioProvider.java
rename to java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/tcp/TcpAioProvider.java
index cb9f2d75a5879c68158461bddd547d0458f9247f..95783fd5aa9540590dd99e70d2d29c2a9afb0cab 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/tcp/TcpAioProvider.java
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/tcp/TcpAioProvider.java
@@ -1,4 +1,4 @@
-package org.noear.socketd.transport.neta.tcp;
+package org.noear.socketd.transport.neta.socket.tcp;
import org.noear.socketd.transport.client.Client;
import org.noear.socketd.transport.client.ClientConfig;
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/tcp/TcpAioServer.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/tcp/TcpAioServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..3cc96864ee8ccab2ea5b2297b67a2712b68a5d8c
--- /dev/null
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/tcp/TcpAioServer.java
@@ -0,0 +1,49 @@
+package org.noear.socketd.transport.neta.socket.tcp;
+
+import net.hasor.neta.channel.NetListen;
+import net.hasor.neta.channel.NetManager;
+import net.hasor.neta.channel.ProtoInitializer;
+import net.hasor.neta.channel.SoConfig;
+import net.hasor.neta.channel.tcp.TcpSoConfig;
+import org.noear.socketd.SocketD;
+import org.noear.socketd.transport.neta.socket.AioServer;
+import org.noear.socketd.transport.neta.socket.AioServerConfig;
+import org.noear.socketd.transport.server.ServerConfig;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+/**
+ * @author noear
+ * @since 2.3
+ */
+public class TcpAioServer extends AioServer {
+ public TcpAioServer(ServerConfig config) {
+ super(config);
+ }
+
+ @Override
+ public String getTitle() {
+ return "tcp/aio/neta 1.0/" + SocketD.version();
+ }
+
+ @Override
+ protected NetListen bindTo(NetManager neta, InetSocketAddress bindAddr, ProtoInitializer initializer) throws IOException {
+ TcpSoConfig soConfig;
+ if (getConfig() instanceof AioServerConfig) {
+ SoConfig config = ((AioServerConfig) getConfig()).getSoConfig();
+ if (config instanceof TcpSoConfig) {
+ soConfig = (TcpSoConfig) config;
+ } else {
+ throw new UnsupportedOperationException("only support TcpSoConfig.");
+ }
+ } else {
+ soConfig = SoConfig.TCP();
+ }
+
+ soConfig.setRcvSlotSize(getConfig().getReadBufferSize());
+ soConfig.setSndSlotSize(getConfig().getWriteBufferSize());
+ soConfig.setSoKeepAlive(false);
+ return neta.bind(bindAddr, initializer, soConfig);
+ }
+}
\ No newline at end of file
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/udp/UdpAioClient.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/udp/UdpAioClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ba3d5596db62e7738e5e8807e2d0ba11e77f47e
--- /dev/null
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/udp/UdpAioClient.java
@@ -0,0 +1,54 @@
+package org.noear.socketd.transport.neta.socket.udp;
+
+import net.hasor.cobble.NumberUtils;
+import net.hasor.cobble.concurrent.future.Future;
+import net.hasor.neta.channel.NetChannel;
+import net.hasor.neta.channel.NetManager;
+import net.hasor.neta.channel.ProtoInitializer;
+import net.hasor.neta.channel.SoConfig;
+import net.hasor.neta.channel.udp.UdpSoConfig;
+import org.noear.socketd.transport.client.ClientConfig;
+import org.noear.socketd.transport.client.ClientConnector;
+import org.noear.socketd.transport.core.Constants;
+import org.noear.socketd.transport.neta.socket.AioClient;
+import org.noear.socketd.transport.neta.socket.AioClientConfig;
+import org.noear.socketd.transport.neta.socket.AioClientConnector;
+
+import java.net.InetSocketAddress;
+
+/**
+ * @author noear
+ * @since 2.3
+ */
+public class UdpAioClient extends AioClient {
+ public UdpAioClient(ClientConfig clientConfig) {
+ super(clientConfig);
+ }
+
+ @Override
+ protected ClientConnector createConnector() {
+ return new AioClientConnector(this) {
+ @Override
+ protected Future connectTo(NetManager neta, InetSocketAddress remoteAddr, ProtoInitializer initializer) {
+ return tcpConnectTo(neta, remoteAddr, initializer);
+ }
+ };
+ }
+
+ protected Future tcpConnectTo(NetManager neta, InetSocketAddress remoteAddr, ProtoInitializer initializer) {
+ UdpSoConfig soConfig;
+ if (getConfig() instanceof AioClientConfig) {
+ SoConfig config = ((AioClientConfig) getConfig()).getSoConfig();
+ if (config instanceof UdpSoConfig) {
+ soConfig = (UdpSoConfig) config;
+ } else {
+ throw new UnsupportedOperationException("only support UdpSoConfig.");
+ }
+ } else {
+ soConfig = SoConfig.UDP();
+ }
+
+ soConfig.setRcvPacketSize(NumberUtils.between(getConfig().getMaxUdpSize(), 2048, Constants.MAX_SIZE_FRAME));
+ return neta.connectAsync(remoteAddr, initializer, soConfig);
+ }
+}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/udp/UdpAioProvider.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/udp/UdpAioProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0776d2ddb01bae7daf71e2d7c847513eb5f586b
--- /dev/null
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/udp/UdpAioProvider.java
@@ -0,0 +1,29 @@
+package org.noear.socketd.transport.neta.socket.udp;
+
+import org.noear.socketd.transport.client.Client;
+import org.noear.socketd.transport.client.ClientConfig;
+import org.noear.socketd.transport.client.ClientProvider;
+import org.noear.socketd.transport.server.Server;
+import org.noear.socketd.transport.server.ServerConfig;
+import org.noear.socketd.transport.server.ServerProvider;
+
+/**
+ * @author noear
+ * @since 2.3
+ */
+public class UdpAioProvider implements ClientProvider, ServerProvider {
+ @Override
+ public String[] schemas() {
+ return new String[] { "udp", "udps", "udp-neta", "sd:udp", "sd:udps", "sd:udp-neta" };
+ }
+
+ @Override
+ public Server createServer(ServerConfig serverConfig) {
+ return new UdpAioServer(serverConfig);
+ }
+
+ @Override
+ public Client createClient(ClientConfig clientConfig) {
+ return new UdpAioClient(clientConfig);
+ }
+}
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/udp/UdpAioServer.java b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/udp/UdpAioServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0f4ecf46c8bcf26d042d28f6c45f8fe333e35c3
--- /dev/null
+++ b/java/socketd-transport/socketd-transport-neta/src/main/java/org/noear/socketd/transport/neta/socket/udp/UdpAioServer.java
@@ -0,0 +1,49 @@
+package org.noear.socketd.transport.neta.socket.udp;
+
+import net.hasor.cobble.NumberUtils;
+import net.hasor.neta.channel.NetListen;
+import net.hasor.neta.channel.NetManager;
+import net.hasor.neta.channel.ProtoInitializer;
+import net.hasor.neta.channel.SoConfig;
+import net.hasor.neta.channel.udp.UdpSoConfig;
+import org.noear.socketd.SocketD;
+import org.noear.socketd.transport.core.Constants;
+import org.noear.socketd.transport.neta.socket.AioServer;
+import org.noear.socketd.transport.neta.socket.AioServerConfig;
+import org.noear.socketd.transport.server.ServerConfig;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+/**
+ * @author noear
+ * @since 2.3
+ */
+public class UdpAioServer extends AioServer {
+ public UdpAioServer(ServerConfig config) {
+ super(config);
+ }
+
+ @Override
+ public String getTitle() {
+ return "udp/aio/neta 1.0/" + SocketD.version();
+ }
+
+ @Override
+ protected NetListen bindTo(NetManager neta, InetSocketAddress bindAddr, ProtoInitializer initializer) throws IOException {
+ UdpSoConfig soConfig;
+ if (getConfig() instanceof AioServerConfig) {
+ SoConfig config = ((AioServerConfig) getConfig()).getSoConfig();
+ if (config instanceof UdpSoConfig) {
+ soConfig = (UdpSoConfig) config;
+ } else {
+ throw new UnsupportedOperationException("only support UdpSoConfig.");
+ }
+ } else {
+ soConfig = SoConfig.UDP();
+ }
+
+ soConfig.setRcvPacketSize(NumberUtils.between(getConfig().getMaxUdpSize(), 2048, Constants.MAX_SIZE_FRAME));
+ return neta.bind(bindAddr, initializer, soConfig);
+ }
+}
\ No newline at end of file
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/resources/META-INF/services/org.noear.socketd.transport.client.ClientProvider b/java/socketd-transport/socketd-transport-neta/src/main/resources/META-INF/services/org.noear.socketd.transport.client.ClientProvider
index 94a9f88a5699bd2211cd3ddb9db4961bf5da7252..1e2f20b0d23f74148b7b8d8a0195333e20eb9755 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/resources/META-INF/services/org.noear.socketd.transport.client.ClientProvider
+++ b/java/socketd-transport/socketd-transport-neta/src/main/resources/META-INF/services/org.noear.socketd.transport.client.ClientProvider
@@ -1 +1,2 @@
-org.noear.socketd.transport.neta.tcp.TcpAioProvider
\ No newline at end of file
+org.noear.socketd.transport.neta.socket.tcp.TcpAioProvider
+org.noear.socketd.transport.neta.socket.udp.UdpAioProvider
\ No newline at end of file
diff --git a/java/socketd-transport/socketd-transport-neta/src/main/resources/META-INF/services/org.noear.socketd.transport.server.ServerProvider b/java/socketd-transport/socketd-transport-neta/src/main/resources/META-INF/services/org.noear.socketd.transport.server.ServerProvider
index 94a9f88a5699bd2211cd3ddb9db4961bf5da7252..1e2f20b0d23f74148b7b8d8a0195333e20eb9755 100644
--- a/java/socketd-transport/socketd-transport-neta/src/main/resources/META-INF/services/org.noear.socketd.transport.server.ServerProvider
+++ b/java/socketd-transport/socketd-transport-neta/src/main/resources/META-INF/services/org.noear.socketd.transport.server.ServerProvider
@@ -1 +1,2 @@
-org.noear.socketd.transport.neta.tcp.TcpAioProvider
\ No newline at end of file
+org.noear.socketd.transport.neta.socket.tcp.TcpAioProvider
+org.noear.socketd.transport.neta.socket.udp.UdpAioProvider
\ No newline at end of file