public static void main(String[] args) throws Exception { Tunnel tunnel = new Tunnel.TunnelBuild() .setPort(8080).setProto("http").setSubDomain("test").build(); new NgrokClient(serverAddress, serverPort) .addTunnel(tunnel).start(); }
private MessageHandler newSocketAndCopy() { SSLSocket newSocket = socketFactory.build(); MessageHandler messageHandler = new MessageHandler(newSocket, socketFactory, null); messageHandler.setClientId(this.clientId); messageHandler.setMappingMap(this.mappingMap); return messageHandler; }
public NgrokClient(String serverAddress, int serverPort) { this.socketFactory = new SocketFactory(serverAddress, serverPort); }
@Override public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) { int port = event.getSource().getPort(); String serverAddress = ngrokProperties.getServerAddress(); int serverPort = ngrokProperties.getServerPort(); String subdomain = ngrokProperties.getSubdomain(); String hostname = ngrokProperties.getHostname(); String proto = ngrokProperties.getProto(); int remotePort = ngrokProperties.getRemotePort(); String httpAuth = ngrokProperties.getHttpAuth(); Tunnel tunnel = new Tunnel.TunnelBuild() .setPort(port) .setProto(proto) .setSubDomain(subdomain) .setHostname(hostname) .setRemotePort(remotePort) .setHttpAuth(httpAuth) .build(); new NgrokClient(serverAddress, serverPort) .addTunnel(tunnel).start(); } }
if (StringUtils.isBlank(error)) { log.debug("auth succeed..."); sendReqTunnel(); WorkerPool.submit(new HealthCheckWorker(this)); } else { WorkerPool.shutdown(); log.error("auth failed error: {}", error); log.info("register url: {}", url); } else { WorkerPool.shutdown(); log.error("NewTunnel failed error: {}", error); MessageHandler messageHandler = newSocketAndCopy(); messageHandler.sendRegProxy(); WorkerPool.submit(new MessageListenerWorker(messageHandler)); break; case "StartProxy": { Tunnel tunnel = mappingMap.get(url); Socket locals = new Socket("127.0.0.1", Integer.valueOf(tunnel.getPort())); WorkerPool.submit(new SocketSwapWorker(this.socket.getInputStream(), locals.getOutputStream())); WorkerPool.submit(new SocketSwapWorker(locals.getInputStream(), this.socket.getOutputStream()));
public void sendReqTunnel() { for (Tunnel tunnel : this.tunnels) { JSONObject reuqest = new JSONObject(); reuqest.put("Type", "ReqTunnel"); JSONObject payload = new JSONObject(); String reqId = UUID.randomUUID().toString() .toLowerCase().replace("-", "") .substring(0, 16); mappingMap.put(reqId, tunnel); payload.put("ReqId", reqId); payload.put("Protocol", tunnel.getProto()); if (tunnel.getProto().equals("tcp")) { payload.put("RemotePort", tunnel.getRemotePort()); } else { payload.put("Subdomain", tunnel.getSubDomain()); payload.put("HttpAuth", tunnel.getHttpAuth()); payload.put("Hostname", tunnel.getHostname()); } reuqest.put("Payload", payload); sendMessage(reuqest.toJSONString()); } }
public void start() { try { this.socket = this.socketFactory.build(); } catch (NgrokClientException e) { log.error("Ngrok Start failed: ", e); return; } MessageHandler messageHandler = new MessageHandler(socket, socketFactory, this.tunnels); WorkerPool.submit(new MessageListenerWorker(messageHandler)); messageHandler.sendAuth(); }
public SSLSocket build() { try { SSLSocket socket = (SSLSocket) trustAllSocketFactory().createSocket(serverAddress, serverPort); socket.startHandshake(); return socket; } catch (Exception e) { throw new NgrokClientException("Create connect failed,Please check ngrok server!", e); } }
public void sendPong() { sendMessage("{\"Type\":\"Pong\",\"Payload\":{}}"); }
public MessageListenerWorker(MessageHandler messageHandler) { this.messageHandler = messageHandler; this.socket = messageHandler.getSocket(); }
public Tunnel build() { if (port == 0) { throw new IllegalArgumentException("port can not be zone"); } if (StringUtils.isBlank(proto)) { throw new IllegalArgumentException("Proto can not be empty"); } return new Tunnel(port, proto, subDomain, hostname, remotePort, httpAuth); }
@Override public void run() { try { while (true) { messageHandler.sendPing(); Thread.sleep(30000); } } catch (Exception e) { log.error("occurred some exception", e); } } }
if (messageHandler.onMessage(json)) { break;
public void sendPing() { sendMessage("{\"Type\":\"Ping\",\"Payload\":{}}"); }
public void sendRegProxy() { sendMessage("{\"Type\":\"RegProxy\",\"Payload\":{\"ClientId\":\"" + clientId + "\"}}"); }
/** * 发送认证授权 */ public void sendAuth() { JSONObject request = new JSONObject(); request.put("Type", "Auth"); JSONObject payload = new JSONObject(); payload.put("Version", "2"); payload.put("MmVersion", "1.7"); payload.put("User", ""); payload.put("Password", ""); payload.put("OS", "darwin"); payload.put("Arch", "amd64"); payload.put("ClientId", ""); request.put("Payload", payload); sendMessage(request.toJSONString()); }