@@ -31,15 +31,20 @@ public class ReverseTcpProxyTunnelClient extends TunnelClient {
31
31
protected static final long HEARTBEAT_DELAY_DEFAULT = 5000 ;// 毫秒
32
32
protected static final long MIN_DELAY_DEFAULT = 1000 ;// 毫秒
33
33
protected static final long MAX_DELAY_DEFAULT = 64000 ;// 毫秒
34
- protected static final String TOKEN_DEFAULT = "123456789" ;
34
+ protected static final String SECRET_DEFAULT = "123456789" ;
35
35
protected static final char [] ID_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" .toCharArray ();
36
36
37
37
38
38
protected final long heartbeatDelay ;
39
- protected final String token ;
39
+ protected final String secret ;
40
40
protected final String name ;
41
41
42
42
43
+ protected String localHost = "127.0.0.1" ;
44
+ protected int localPort = 2222 ;
45
+ protected int remotePort = 2222 ;
46
+
47
+
43
48
protected static String generateName () {
44
49
final String prefix = "ReverseTcpProxyTunnelClient-" ;
45
50
try {
@@ -61,76 +66,88 @@ protected static String generateName() {
61
66
62
67
protected ReverseTcpProxyTunnelClient (Vertx vertx , NetClient netClient ,
63
68
long minDelay , long maxDelay , long heartbeatDelay ,
64
- String token , String name ) {
69
+ String secret , String name ) {
65
70
super (vertx , netClient , minDelay , maxDelay );
66
71
this .heartbeatDelay = heartbeatDelay ;
67
- this .token = token ;
72
+ this .secret = secret ;
68
73
this .name = name ;
69
74
addMessageHandler ();
70
75
}
71
76
77
+ public ReverseTcpProxyTunnelClient localHost (String localHost ) {
78
+ this .localHost = localHost ;
79
+ return this ;
80
+ }
81
+
82
+ public ReverseTcpProxyTunnelClient localPort (int localPort ) {
83
+ this .localPort = localPort ;
84
+ return this ;
85
+ }
86
+
87
+ public ReverseTcpProxyTunnelClient remotePort (int remotePort ) {
88
+ this .remotePort = remotePort ;
89
+ return this ;
90
+ }
91
+
72
92
/**
73
93
* 注册内网穿透的监听逻辑
74
94
*/
75
95
protected void addMessageHandler () {
76
96
// 监听连接成功事件
77
- this .onConnected ((vertx , netSocket , buffer ) -> emit (TunnelMessageType .AUTH , TunnelMessage .Auth
78
- .newBuilder ()
79
- .setToken (token )
80
- .build ()
81
- .toByteArray ()));
82
- // 监听授权响应事件
83
- this .on (TunnelMessageType .AUTH_ACK , new AbstractTunnelHandler () {
97
+ this .onConnected ((vertx , netSocket , buffer ) -> netSocket .write (encode (TunnelMessageType .OPEN_DATA_PORT ,
98
+ TunnelMessage .OpenDataPort .newBuilder ()
99
+ .setSecret (secret )
100
+ .setPort (remotePort )
101
+ .build ().toByteArray ())));
102
+
103
+ // 监听授权与开通数据端口事件
104
+ this .on (TunnelMessageType .OPEN_DATA_PORT_ACK , new AbstractTunnelHandler () {
84
105
@ Override
85
106
protected boolean doHandle (Vertx vertx , NetSocket netSocket , TunnelMessageType type , byte [] bodyBytes ) {
86
107
boolean result = false ;
87
108
try {
88
- TunnelMessage .AuthAck ack = TunnelMessage .AuthAck .parseFrom (bodyBytes );
89
- result = ack .getSuccess ();
90
- if ( result ) {
91
- vertx .setTimer (heartbeatDelay , id -> emit (TunnelMessageType .HEARTBEAT ,
92
- TunnelMessage .Heartbeat .newBuilder ()
93
- . setTimestamp ( System . currentTimeMillis ())
94
- . build ()
95
- . toByteArray () ));
109
+ TunnelMessage .OpenDataPortAck parsed = TunnelMessage .OpenDataPortAck .parseFrom (bodyBytes );
110
+ if ( parsed .getSuccess ()) {
111
+ // 如果认证 + 开通端口成功,那么就需要进行长连接保持,并开启定期心跳。
112
+ vertx .setTimer (heartbeatDelay , id -> netSocket . write ( encode (TunnelMessageType .HEARTBEAT ,
113
+ TunnelMessage .Heartbeat .newBuilder (). setTimestamp ( System . currentTimeMillis ()). build (). toByteArray ())));
114
+ } else {
115
+ // 如果认证失败,服务端会主动关闭 tcp 连接
116
+ log . warn ( "{} error : {}" , TunnelMessageType . OPEN_DATA_PORT_ACK , parsed . getMessage ( ));
96
117
}
97
118
} catch (Exception e ) {
98
119
}
99
120
return result ;
100
121
}
101
122
});
102
- // 监听心跳响应事件
123
+
124
+ // 监听心跳事件
103
125
this .on (TunnelMessageType .HEARTBEAT_ACK , new AbstractTunnelHandler () {
104
126
@ Override
105
127
protected boolean doHandle (Vertx vertx , NetSocket netSocket , TunnelMessageType type , byte [] bodyBytes ) {
106
- try {
107
- vertx .setTimer (heartbeatDelay , id -> emit (TunnelMessageType .HEARTBEAT ,
108
- TunnelMessage .Heartbeat .newBuilder ()
109
- .setTimestamp (System .currentTimeMillis ())
110
- .build ()
111
- .toByteArray ()));
112
- } catch (Exception e ) {
113
- }
128
+ // 只要收到心跳,就证明没问题。不用去解析内容。直接开启下一波心跳计划即可。
129
+ vertx .setTimer (heartbeatDelay , id -> netSocket .write (encode (TunnelMessageType .HEARTBEAT ,
130
+ TunnelMessage .Heartbeat .newBuilder ().setTimestamp (System .currentTimeMillis ()).build ().toByteArray ())));
114
131
return true ;
115
132
}
116
133
});
117
134
}
118
135
119
- public static ReverseTcpProxyTunnelClient create (Vertx vertx , NetClient netClient , long minDelay , long maxDelay , long heartbeatDelay , String token , String name ) {
120
- return new ReverseTcpProxyTunnelClient (vertx , netClient , minDelay , maxDelay , heartbeatDelay , token , name );
136
+ public static ReverseTcpProxyTunnelClient create (Vertx vertx , NetClient netClient , long minDelay , long maxDelay , long heartbeatDelay , String secret , String name ) {
137
+ return new ReverseTcpProxyTunnelClient (vertx , netClient , minDelay , maxDelay , heartbeatDelay , secret , name );
121
138
}
122
139
123
- public static ReverseTcpProxyTunnelClient create (Vertx vertx , NetClient netClient , String token ) {
124
- return new ReverseTcpProxyTunnelClient (vertx , netClient , MIN_DELAY_DEFAULT , MAX_DELAY_DEFAULT , HEARTBEAT_DELAY_DEFAULT , token , generateName ());
140
+ public static ReverseTcpProxyTunnelClient create (Vertx vertx , NetClient netClient , String secret ) {
141
+ return new ReverseTcpProxyTunnelClient (vertx , netClient , MIN_DELAY_DEFAULT , MAX_DELAY_DEFAULT , HEARTBEAT_DELAY_DEFAULT , secret , generateName ());
125
142
}
126
143
127
144
128
145
public static ReverseTcpProxyTunnelClient create (Vertx vertx , NetClient netClient ) {
129
- return new ReverseTcpProxyTunnelClient (vertx , netClient , MIN_DELAY_DEFAULT , MAX_DELAY_DEFAULT , HEARTBEAT_DELAY_DEFAULT , TOKEN_DEFAULT , generateName ());
146
+ return new ReverseTcpProxyTunnelClient (vertx , netClient , MIN_DELAY_DEFAULT , MAX_DELAY_DEFAULT , HEARTBEAT_DELAY_DEFAULT , SECRET_DEFAULT , generateName ());
130
147
}
131
148
132
149
public static ReverseTcpProxyTunnelClient create (Vertx vertx ) {
133
- return new ReverseTcpProxyTunnelClient (vertx , vertx .createNetClient (), MIN_DELAY_DEFAULT , MAX_DELAY_DEFAULT , HEARTBEAT_DELAY_DEFAULT , TOKEN_DEFAULT , generateName ());
150
+ return new ReverseTcpProxyTunnelClient (vertx , vertx .createNetClient (), MIN_DELAY_DEFAULT , MAX_DELAY_DEFAULT , HEARTBEAT_DELAY_DEFAULT , SECRET_DEFAULT , generateName ());
134
151
}
135
152
136
153
0 commit comments