mirror of
https://github.com/sirjonasxx/G-Earth.git
synced 2024-11-23 00:40:51 +01:00
unity proxy provider
This commit is contained in:
parent
1ddfbbe420
commit
1ad3a52c33
@ -1,27 +1,32 @@
|
||||
package gearth.protocol.connection.proxy.unity;
|
||||
|
||||
import gearth.protocol.HConnection;
|
||||
import gearth.protocol.StateChangeListener;
|
||||
import gearth.protocol.connection.HProxySetter;
|
||||
import gearth.protocol.connection.HState;
|
||||
import gearth.protocol.connection.HStateSetter;
|
||||
import gearth.protocol.connection.proxy.ProxyProvider;
|
||||
import gearth.services.unity_tools.GUnityFileServer;
|
||||
import org.eclipse.jetty.server.Handler;
|
||||
import org.eclipse.jetty.server.Server;
|
||||
import org.eclipse.jetty.server.handler.HandlerList;
|
||||
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||
import org.eclipse.jetty.servlet.ServletHolder;
|
||||
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
|
||||
|
||||
import javax.websocket.server.ServerContainer;
|
||||
import javax.websocket.server.ServerEndpointConfig;
|
||||
import java.io.IOException;
|
||||
|
||||
import static gearth.services.unity_tools.GUnityFileServer.FILESERVER_PORT;
|
||||
|
||||
public class UnityProxyProvider implements ProxyProvider {
|
||||
|
||||
private final HProxySetter proxySetter;
|
||||
private final HStateSetter stateSetter;
|
||||
private final HConnection hConnection;
|
||||
|
||||
private Server server;
|
||||
private Server packetHandlerServer = null;
|
||||
|
||||
public UnityProxyProvider(HProxySetter proxySetter, HStateSetter stateSetter, HConnection hConnection) {
|
||||
this.proxySetter = proxySetter;
|
||||
@ -32,40 +37,61 @@ public class UnityProxyProvider implements ProxyProvider {
|
||||
|
||||
@Override
|
||||
public void start() throws IOException {
|
||||
|
||||
// https://happyhyppo.ro/2016/03/21/minimal-websockets-communication-with-javajetty-and-angularjs/
|
||||
server = new Server(8025);
|
||||
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
|
||||
context.setContextPath("/ws");
|
||||
|
||||
HandlerList handlers = new HandlerList();
|
||||
handlers.setHandlers(new Handler[] { context });
|
||||
server.setHandler(handlers);
|
||||
|
||||
ServerContainer wscontainer = null;
|
||||
try {
|
||||
wscontainer = WebSocketServerContainerInitializer.configureContext(context);
|
||||
int port = 9040;
|
||||
boolean fail = true;
|
||||
while (fail && port < 9100) {
|
||||
try {
|
||||
packetHandlerServer = new Server(port);
|
||||
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
|
||||
context.setContextPath("/ws");
|
||||
|
||||
wscontainer.addEndpoint(ServerEndpointConfig.Builder
|
||||
.create(UnityCommunicator.class, "/packethandler") // the endpoint url
|
||||
.configurator(new UnityCommunicatorConfig(proxySetter, stateSetter, hConnection, this))
|
||||
.build());
|
||||
HandlerList handlers = new HandlerList();
|
||||
handlers.setHandlers(new Handler[] { context });
|
||||
|
||||
server.start();
|
||||
ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(context);
|
||||
wscontainer.addEndpoint(ServerEndpointConfig.Builder
|
||||
.create(UnityCommunicator.class, "/packethandler") // the endpoint url
|
||||
.configurator(new UnityCommunicatorConfig(proxySetter, stateSetter, hConnection, this))
|
||||
.build());
|
||||
packetHandlerServer.setHandler(handlers);
|
||||
packetHandlerServer.start();
|
||||
fail = false;
|
||||
}
|
||||
catch (Exception e) {
|
||||
port++;
|
||||
}
|
||||
}
|
||||
|
||||
if (fail) {
|
||||
throw new Exception();
|
||||
}
|
||||
|
||||
|
||||
startPortRequestServer(port);
|
||||
startUnityFileServer();
|
||||
stateSetter.setState(HState.WAITING_FOR_CLIENT);
|
||||
|
||||
} catch (Exception e) {
|
||||
stateSetter.setState(HState.NOT_CONNECTED);
|
||||
try {
|
||||
packetHandlerServer.stop();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void abort() {
|
||||
if (server == null) {
|
||||
if (packetHandlerServer == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final Server abortThis = server;
|
||||
final Server abortThis = packetHandlerServer;
|
||||
stateSetter.setState(HState.ABORTING);
|
||||
new Thread(() -> {
|
||||
try {
|
||||
@ -76,6 +102,67 @@ public class UnityProxyProvider implements ProxyProvider {
|
||||
stateSetter.setState(HState.NOT_CONNECTED);
|
||||
}
|
||||
}).start();
|
||||
server = null;
|
||||
packetHandlerServer = null;
|
||||
}
|
||||
|
||||
private void startUnityFileServer() throws Exception {
|
||||
Server server = new Server(FILESERVER_PORT);
|
||||
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
|
||||
context.setContextPath("/");
|
||||
|
||||
context.addServlet(new ServletHolder(new GUnityFileServer()), "/*");
|
||||
|
||||
HandlerList handlers = new HandlerList();
|
||||
handlers.setHandlers(new Handler[] { context });
|
||||
server.setHandler(handlers);
|
||||
|
||||
server.start();
|
||||
StateChangeListener fileServerCloser = new StateChangeListener() {
|
||||
@Override
|
||||
public void stateChanged(HState oldState, HState newState) {
|
||||
if (oldState == HState.WAITING_FOR_CLIENT || newState == HState.NOT_CONNECTED) {
|
||||
hConnection.getStateObservable().removeListener(this);
|
||||
try {
|
||||
server.stop();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
hConnection.getStateObservable().addListener(fileServerCloser);
|
||||
}
|
||||
|
||||
private void startPortRequestServer(int packetHandlerPort) throws Exception {
|
||||
Server portRequestServer = new Server(9039);
|
||||
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
|
||||
context.setContextPath("/ws");
|
||||
|
||||
HandlerList handlers = new HandlerList();
|
||||
handlers.setHandlers(new Handler[] { context });
|
||||
portRequestServer.setHandler(handlers);
|
||||
|
||||
ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(context);
|
||||
wscontainer.addEndpoint(ServerEndpointConfig.Builder
|
||||
.create(PortRequester.class, "/portrequest") // the endpoint url
|
||||
.configurator(new PortRequesterConfig(packetHandlerPort))
|
||||
.build());
|
||||
|
||||
portRequestServer.start();
|
||||
|
||||
StateChangeListener portRequesterCloser = new StateChangeListener() {
|
||||
@Override
|
||||
public void stateChanged(HState oldState, HState newState) {
|
||||
if (oldState == HState.WAITING_FOR_CLIENT || newState == HState.NOT_CONNECTED) {
|
||||
hConnection.getStateObservable().removeListener(this);
|
||||
try {
|
||||
portRequestServer.stop();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
hConnection.getStateObservable().addListener(portRequesterCloser);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user