Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions src/test/java/top/meethigher/proxy/tcp/tunnel/Issue8Test.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package top.meethigher.proxy.tcp.tunnel;

import io.vertx.core.Vertx;
import io.vertx.core.net.NetClient;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class Issue8Test {

private static final Logger log = LoggerFactory.getLogger(Issue8Test.class);

@Test
public void test() throws Exception {

/**
* IDEA 多配置“批量启动”——使用 Run/Debug Configuration 的“Compound”功能
* 步骤如下:
* 打开Run/Debug Configurations窗口(快捷键 Ctrl+Alt+R / 右上角 Edit Configurations)。
*
* 新建三个 Application 类型配置,分别设置好 ClassA、ClassB、ClassC 的 main。
*
* 再新建一个Compound类型配置。
*
* 在 Compound 配置的“Run/Debug Configurations”里,添加刚刚那三个配置,顺序拖拽即可调整。
*
* 选中 Compound 配置,点绿色启动按钮,一次性批量顺序启动三(或更多)个实例。
*
* 注意:Compound 是并发同时,不是顺序启动。IDEA 会按照你添加的顺序一个一个起。
*/

// step1: run top.meethigher.proxy.tcp.tunnel.issue8.Issue8BackendServer.main

// step2: run top.meethigher.proxy.tcp.tunnel.issue8.Issue8TunnelServer.main

// step3: run top.meethigher.proxy.tcp.tunnel.issue8.Issue8TunnelClient.main

Vertx vertx = Vertx.vertx();
NetClient netClient = vertx.createNetClient();
int total = 500;
CountDownLatch latch = new CountDownLatch(total);
for (int i = 0; i < total; i++) {
final String id = String.valueOf(i + 1);
netClient.connect(2222, "127.0.0.1").onSuccess(socket -> {
socket.pause();
socket.handler(buf -> {
log.info("{} received: {}", id, buf);
latch.countDown();
});
socket.resume();
});
}

latch.await(5, TimeUnit.SECONDS);
Assert.assertEquals(total, total - latch.getCount());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package top.meethigher.proxy.tcp.tunnel.issue8;

import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.net.NetServer;

public class Issue8BackendServer {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
NetServer netServer = vertx.createNetServer();
netServer.connectHandler(socket -> {
socket.remoteAddress();
socket.write(Buffer.buffer("SSH-2.0-OpenSSH_8.7")).onComplete(ar -> {
System.out.println(socket.remoteAddress().toString() + " write " + ar.succeeded());
});
}).listen(23).onComplete(ar -> {
if (ar.succeeded()) {
System.out.println("Server started on port " + ar.result().actualPort());
} else {
System.err.println("Server failed to start");
ar.cause().printStackTrace();
System.exit(1);
}
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package top.meethigher.proxy.tcp.tunnel.issue8;

import io.vertx.core.Vertx;
import io.vertx.core.net.NetClient;
import io.vertx.core.net.NetClientOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.meethigher.proxy.tcp.tunnel.ReverseTcpProxyTunnelClient;

import java.util.concurrent.TimeUnit;

public class Issue8TunnelClient {

private static final Vertx vertx = Vertx.vertx();
private static final Logger log = LoggerFactory.getLogger(Issue8TunnelClient.class);

public static void main(String[] args) {
NetClient netClient = vertx.createNetClient(new NetClientOptions()
.setIdleTimeout(999999999)
.setIdleTimeoutUnit(TimeUnit.MILLISECONDS));
ReverseTcpProxyTunnelClient.create(vertx, netClient)
.dataProxyPort(2222)
.dataProxyHost("127.0.0.1")
.dataProxyName("ssh")
.backendHost("127.0.0.1")
.backendPort(23)
.connect("127.0.0.1", 44444);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package top.meethigher.proxy.tcp.tunnel.issue8;

import io.vertx.core.Vertx;
import io.vertx.core.net.NetServer;
import io.vertx.core.net.NetServerOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.meethigher.proxy.tcp.tunnel.ReverseTcpProxyTunnelServer;

import java.util.concurrent.TimeUnit;

public class Issue8TunnelServer {

private static final Vertx vertx = Vertx.vertx();
private static final Logger log = LoggerFactory.getLogger(Issue8TunnelServer.class);

public static void main(String[] args) {
NetServer netServer = vertx.createNetServer(
new NetServerOptions()
.setIdleTimeout(999999999)
.setIdleTimeoutUnit(TimeUnit.MILLISECONDS));
ReverseTcpProxyTunnelServer.create(vertx, netServer)
.heartbeatDelay(888888888)
.judgeDelay(50)
.port(44444)
.start();
}
}