Removed old server code and replaced Account with a different implementation

This commit is contained in:
Collin Smith
2019-11-30 22:14:07 -08:00
parent 018cc9767c
commit c4917021ad
20 changed files with 22 additions and 970 deletions

View File

@ -0,0 +1,18 @@
package com.riiablo.net;
import com.riiablo.net.packet.bnls.LoginResponse;
public class Account {
public String username;
public Account() {}
public Account(LoginResponse loginResponse) {
username = loginResponse.username();
}
@Override
public String toString() {
return username;
}
}

View File

@ -41,7 +41,7 @@ import com.riiablo.net.packet.mcp.ListGames;
import com.riiablo.net.packet.mcp.MCP;
import com.riiablo.net.packet.mcp.MCPData;
import com.riiablo.net.packet.mcp.Result;
import com.riiablo.server.Account;
import com.riiablo.net.Account;
import com.riiablo.util.EventUtils;
import com.riiablo.widget.Label;
import com.riiablo.widget.TextArea;

View File

@ -30,7 +30,7 @@ import com.riiablo.loader.DC6Loader;
import com.riiablo.net.packet.bnls.BNLS;
import com.riiablo.net.packet.bnls.BNLSData;
import com.riiablo.net.packet.bnls.LoginResponse;
import com.riiablo.server.Account;
import com.riiablo.net.Account;
import com.riiablo.widget.AnimationWrapper;
import com.riiablo.widget.Label;
import com.riiablo.widget.TextButton;
@ -118,7 +118,6 @@ public class LoginScreen extends ScreenAdapter {
public void clicked(InputEvent event, float x, float y) {
Actor actor = event.getListenerActor();
if (actor == btnLogIn) {
Socket socket = null;
try {
socket = Gdx.net.newClientSocket(Net.Protocol.TCP, Riiablo.client.getRealm(), 6110, null);
@ -256,7 +255,7 @@ public class LoginScreen extends ScreenAdapter {
case BNLSData.LoginResponse:
Gdx.app.debug(TAG, "Login successful!");
LoginResponse response = (LoginResponse) packet.data(new LoginResponse());
final Account account = Account.builder().setAccount(response.username()).build();
final Account account = new Account(response);
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {

View File

@ -21,7 +21,7 @@ import com.riiablo.codec.DC6;
import com.riiablo.codec.StringTBL;
import com.riiablo.graphics.PaletteIndexedBatch;
import com.riiablo.loader.DC6Loader;
import com.riiablo.server.Account;
import com.riiablo.net.Account;
import com.riiablo.widget.CharacterSelectButton;
import com.riiablo.widget.TextButton;

View File

@ -1,37 +0,0 @@
package com.riiablo.server;
public class Account {
private String account;
private String password;
private Account() {}
private Account(Builder builder) {
account = builder.account;
password = "";
}
@Override
public String toString() {
return account;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
public String account;
public String hash;
public Builder setAccount(String account) {
this.account = account;
return this;
}
public Account build() {
return new Account(this);
}
}
}

View File

@ -1,29 +0,0 @@
package com.riiablo.server;
import com.badlogic.ashley.core.Entity;
public class Connect {
public int id;
public String name;
public int classId;
public byte[] composites;
public byte[] colors;
private Connect() {}
public Connect(String name, int classId, byte[] composites, byte[] colors) {
this.name = name;
this.classId = classId;
this.composites = composites;
this.colors = colors;
}
public Connect(Entity player) {
// Player.D2SStats stats = (Player.D2SStats) player.stats;
// this.name = stats.d2s.header.name;
// this.classId = stats.d2s.header.charClass;
// this.composites = stats.d2s.header.composites;
// this.colors = stats.d2s.header.colors;
}
}

View File

@ -1,13 +0,0 @@
package com.riiablo.server;
public class ConnectResponse {
public int id;
private ConnectResponse() {}
public ConnectResponse(int id) {
this.id = id;
}
}

View File

@ -1,15 +0,0 @@
package com.riiablo.server;
public class Disconnect {
public int id;
public String name;
private Disconnect() {}
public Disconnect(int id, String name) {
this.id = id;
this.name = name;
}
}

View File

@ -1,16 +0,0 @@
package com.riiablo.server;
import com.riiablo.Riiablo;
public class Event {
public int id;
public String[] args;
private Event() {}
@Override
public String toString() {
return Riiablo.string.format(id, (Object[]) args);
}
}

View File

@ -1,19 +0,0 @@
package com.riiablo.server;
public class Message {
public String name;
public String text;
private Message() {}
public Message(String name, String text) {
this.name = name;
this.text = text;
}
@Override
public String toString() {
return name + ": " + text;
}
}

View File

@ -1,20 +0,0 @@
package com.riiablo.server;
import com.badlogic.gdx.math.GridPoint2;
public class MoveTo {
public int id;
public int x;
public int y;
public float angle;
private MoveTo() {}
public MoveTo(GridPoint2 origin, float angle) {
x = origin.x;
y = origin.y;
this.angle = angle;
}
}

View File

@ -1,28 +0,0 @@
package com.riiablo.server;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonValue;
public class Packet {
private static final Json JSON = new Json();
public int type;
public int version;
public JsonValue data;
Packet(int type, int version, JsonValue data) {
this.type = type;
this.version = version;
this.data = data;
}
public <T> T readValue(Class<T> type) {
return JSON.readValue(type, data);
}
@Override
public String toString() {
return JSON.toJson(this);
}
}

View File

@ -1,67 +0,0 @@
package com.riiablo.server;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonReader;
import com.badlogic.gdx.utils.JsonValue;
import com.badlogic.gdx.utils.ObjectIntMap;
public class Packets {
private static final Json JSON = new Json();
private Packets() {}
public static final int MESSAGE = 1;
public static final int CONNECT = 2;
public static final int DISCONNECT = 3;
public static final int MOVETO = 4;
public static final int CONNECT_RESPONSE = 5;
private static final ObjectIntMap<Class> MAP;
static {
MAP = new ObjectIntMap<>();
MAP.put(Message.class, 1);
MAP.put(Connect.class, 2);
MAP.put(Disconnect.class, 3);
MAP.put(MoveTo.class, 4);
MAP.put(ConnectResponse.class, 5);
}
public static <T> T parse(Class<T> type, String json) {
return parse(json).readValue(type);
}
public static Packet parse(String json) {
// TODO: Replace with indexes when well-formed later on
JsonValue value = new JsonReader().parse(json);
int type = value.getInt("type", 0);
int version = value.getInt("version", 0);
JsonValue data = value.get("data");
return new Packet(type, version, data);
}
public static int getType(String json) {
return new JsonReader().parse(json).getInt("type", 0);
}
public static String build(Object instance) {
int type = MAP.get(instance.getClass(), 0);
if (type == 0) return null;
//JsonValue data = new JsonReader().parse(JSON.toJson(instance));
EncodedJsonPacket obj = new EncodedJsonPacket(type, 0, instance);
return JSON.toJson(obj);
}
private static class EncodedJsonPacket {
int type;
int version;
Object data;
EncodedJsonPacket() {}
EncodedJsonPacket(int type, int version, Object data) {
this.type = type;
this.version = version;
this.data = data;
}
}
}

View File

@ -1,41 +0,0 @@
package com.riiablo.server;
public class Session {
public String name;
public String password;
public String desc;
public String host;
public int port;
private Session() {}
public Session(String name) {
this.name = name;
}
public Session(Builder builder) {
name = builder.name;
password = builder.password;
desc = builder.desc;
}
public String getName() {
return name;
}
@Override
public String toString() {
return getName();
}
public static class Builder {
public String name;
public String password;
public String desc;
public Session build() {
return new Session(this);
}
}
}

View File

@ -1,27 +0,0 @@
package com.riiablo.server;
public class SessionError {
private int code;
private String message;
private SessionError() {}
public SessionError(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
@Override
public String toString() {
return code + " " + message;
}
}

View File

@ -1,139 +0,0 @@
package com.riiablo.server;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Net;
import com.badlogic.gdx.backends.headless.HeadlessApplication;
import com.badlogic.gdx.backends.headless.HeadlessApplicationConfiguration;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.net.ServerSocket;
import com.badlogic.gdx.net.Socket;
import com.badlogic.gdx.utils.Json;
import org.apache.commons.io.IOUtils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicBoolean;
public class ChatServer extends ApplicationAdapter {
private static final String TAG = "ChatServer";
public static void main(String[] args) {
HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration();
new HeadlessApplication(new ChatServer(), config);
}
private final Json json = new Json();
private Set<PrintWriter> clients = new CopyOnWriteArraySet<>();
ThreadGroup clientThreads;
ServerSocket server;
Thread thread;
AtomicBoolean kill;
ChatServer() {}
@Override
public void create() {
final Calendar calendar = Calendar.getInstance();
DateFormat format = DateFormat.getDateTimeInstance();
Gdx.app.log(TAG, format.format(calendar.getTime()));
try {
InetAddress address = InetAddress.getLocalHost();
Gdx.app.log(TAG, "IP Address: " + address.getHostAddress());
Gdx.app.log(TAG, "Host Name: " + address.getHostName());
} catch (UnknownHostException e) {
Gdx.app.error(TAG, e.getMessage(), e);
}
clientThreads = new ThreadGroup("Clients");
kill = new AtomicBoolean(false);
server = Gdx.net.newServerSocket(Net.Protocol.TCP, 6113, null);
thread = new Thread(new Runnable() {
@Override
public void run() {
while (!kill.get()) {
Socket socket = server.accept(null);
Gdx.app.log(TAG, "CONNECT " + socket.getRemoteAddress());
new Client(socket).start();
}
}
});
thread.setName("ChatServer");
thread.start();
}
@Override
public void render() {
}
@Override
public void dispose() {
Gdx.app.log(TAG, "shutting down...");
kill.set(true);
try {
thread.join();
} catch (Throwable ignored) {}
server.dispose();
}
private class Client extends Thread {
Socket socket;
BufferedReader in;
PrintWriter out;
public Client(Socket socket) {
super(clientThreads, "Client-" + String.format("%08X", MathUtils.random(1, Integer.MAX_VALUE - 1)));
this.socket = socket;
}
@Override
public void run() {
try {
in = IOUtils.buffer(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
final Calendar calendar = Calendar.getInstance();
DateFormat format = DateFormat.getDateTimeInstance();
out.println("BNET " + format.format(calendar.getTime()));
for (PrintWriter client : clients) {
client.println("CONNECT " + socket.getRemoteAddress());
}
clients.add(out);
for (String input; (input = in.readLine()) != null; ) {
String message = "MESSAGE " + socket.getRemoteAddress() + ": " + input;
Gdx.app.log(TAG, message);
for (PrintWriter client : clients) {
client.println(message);
}
}
} catch (Throwable t) {
Gdx.app.log(TAG, "ERROR " + socket.getRemoteAddress() + ": " + t.getMessage());
} finally {
String message = "DISCONNECT " + socket.getRemoteAddress();
Gdx.app.log(TAG, message);
for (PrintWriter client : clients) {
client.println(message);
}
//IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
if (out != null) clients.remove(out);
if (socket != null) socket.dispose();
}
}
}
}

View File

@ -1,43 +0,0 @@
package com.riiablo.server;
import com.badlogic.gdx.utils.Disposable;
import java.util.concurrent.atomic.AtomicBoolean;
public class DedicatedServer extends Thread implements Disposable {
private static final String TAG = "DedicatedServer";
Server server;
AtomicBoolean kill;
DedicatedServer(ThreadGroup group, String name, Server target) {
super(group, target, name);
server = target;
kill = new AtomicBoolean(false);
}
public static DedicatedServer newDedicatedServer(ThreadGroup group, String name, int port) {
Server server = new Server(port, name);
return new DedicatedServer(group, name, server);
}
@Override
public void run() {
super.run();
while (!kill.get()) {
try {
Thread.sleep(100);
} catch (InterruptedException ignored) {}
server.update();
}
}
@Override
public void dispose() {
kill.set(true);
//try {
// join();
//} catch (InterruptedException ignored) {}
server.dispose();
}
}

View File

@ -1,208 +0,0 @@
package com.riiablo.server;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Net;
import com.badlogic.gdx.backends.headless.HeadlessApplication;
import com.badlogic.gdx.backends.headless.HeadlessApplicationConfiguration;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.net.ServerSocket;
import com.badlogic.gdx.net.Socket;
import com.badlogic.gdx.utils.Json;
import org.apache.commons.io.IOUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
public class ServerBrowser extends ApplicationAdapter {
private static final String TAG = "Server";
public static void main(String[] args) {
HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration();
new HeadlessApplication(new ServerBrowser(), config);
}
private static final boolean EXT_HOST = true;
private String host;
private final Json json = new Json();
private Map<String, Session> sessions = new ConcurrentHashMap<>();
ServerSocket server;
Thread thread;
AtomicBoolean kill;
ThreadGroup sessionGroup = new ThreadGroup("Sessions");
private Map<String, Thread> servers = new ConcurrentHashMap<>();
ServerBrowser() {}
private static String getIp() {
if (!EXT_HOST) {
try {
InetAddress address = InetAddress.getLocalHost();
return address.getHostAddress();
} catch (UnknownHostException e) {
Gdx.app.error(TAG, e.getMessage(), e);
return "hydra";
}
}
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(new URL("http://checkip.amazonaws.com").openStream()));
return in.readLine();
} catch (IOException e) {
Gdx.app.error(TAG, e.getMessage(), e);
return "hydra";
} finally {
IOUtils.closeQuietly(in);
}
}
@Override
public void create() {
final Calendar calendar = Calendar.getInstance();
DateFormat format = DateFormat.getDateTimeInstance();
Gdx.app.log(TAG, format.format(calendar.getTime()));
host = getIp();
try {
InetAddress address = InetAddress.getLocalHost();
Gdx.app.log(TAG, "IP Address: " + host);
Gdx.app.log(TAG, "Host Name: " + address.getHostName());
} catch (UnknownHostException e) {
Gdx.app.error(TAG, e.getMessage(), e);
}
kill = new AtomicBoolean(false);
server = Gdx.net.newServerSocket(Net.Protocol.TCP, 6112, null);
thread = new Thread(new Runnable() {
@Override
public void run() {
while (!kill.get()) {
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
try {
socket = server.accept(null);
Gdx.app.log(TAG, "connection from " + socket.getRemoteAddress());
in = IOUtils.buffer(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), false);
String statusLine = in.readLine();
Gdx.app.log(TAG, statusLine);
String[] parts = statusLine.split("\\s+", 3);
String path = parts[1];
if (path.equals("/get-sessions")) {
getSessions(out);
} else if (path.equals("/create-session")) {
createSession(in, out);
} else if (path.equals("/find-server")) {
findServer(out);
} else if (path.equals("/login")) {
login(in, out);
} else if (path.equals("/chat")) {
chat(in, out);
}
} catch (Throwable t) {
Gdx.app.error(TAG, t.getMessage(), t);
} finally {
//IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
if (socket != null) socket.dispose();
}
}
}
});
thread.setName("ServerBrowser");
thread.start();
}
@Override
public void render() {
}
@Override
public void dispose() {
Gdx.app.log(TAG, "shutting down...");
kill.set(true);
try {
thread.join();
} catch (Throwable ignored) {}
server.dispose();
}
private void getSessions(PrintWriter out) {
out.print("HTTP/1.1 200\r\n");
out.print("\r\n");
out.print(json.toJson(sessions.values()));
}
private void createSession(BufferedReader in, PrintWriter out) {
String content = ServerUtils.getContent(in);
Session.Builder builder = json.fromJson(Session.Builder.class, content);
if (sessions.containsKey(builder.name)) {
SessionError error = new SessionError(5138, "A game already exists with that name");
out.print("HTTP/1.1 200\r\n");
out.print("\r\n");
out.print(json.toJson(error));
return;
} else if (sessions.size() >= 2) {
SessionError error = new SessionError(5140, "No game server available");
out.print("HTTP/1.1 200\r\n");
out.print("\r\n");
out.print(json.toJson(error));
return;
}
Session session = builder.build();
session.host = host;
session.port = 6114 + sessions.size();
sessions.put(session.getName(), session);
String id = String.format("%08X", MathUtils.random(1, Integer.MAX_VALUE - 1));
DedicatedServer server = DedicatedServer.newDedicatedServer(sessionGroup, "Session-" + id, session.port);
server.start();
servers.put(session.getName(), server);
out.print("HTTP/1.1 200\r\n");
out.print("\r\n");
out.print(json.toJson(session));
}
private void findServer(PrintWriter out) {
out.print("HTTP/1.1 200\r\n");
out.print("\r\n");
}
private void login(BufferedReader in, PrintWriter out) {
String content = ServerUtils.getContent(in);
//System.out.println(content);
Account.Builder builder = json.fromJson(Account.Builder.class, content);
out.print("HTTP/1.1 200\r\n");
out.print("\r\n");
out.print(json.toJson(builder.build()));
}
private void chat(BufferedReader in, PrintWriter out) {
out.print("HTTP/1.1 200\r\n");
out.print("\r\n");
}
}

View File

@ -1,35 +0,0 @@
package com.riiablo.server;
import com.badlogic.gdx.Gdx;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import java.io.BufferedReader;
import java.io.IOException;
public class ServerUtils {
private static final String TAG = "ServerUtils";
private ServerUtils() {}
public static String getContent(BufferedReader reader) {
try {
int length = -1;
for (String str; (str = reader.readLine()) != null && !str.isEmpty();) {
if (StringUtils.startsWithIgnoreCase(str, "Content-Length:")) {
str = StringUtils.replaceIgnoreCase(str, "Content-Length:", "").trim();
length = NumberUtils.toInt(str, length);
}
}
char[] chars = new char[length];
reader.read(chars);
return new String(chars);
} catch (IOException e) {
Gdx.app.error(TAG, e.getMessage(), e);
return null;
}
}
}

View File

@ -1,228 +0,0 @@
package com.riiablo.server;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Net;
import com.badlogic.gdx.backends.headless.HeadlessApplication;
import com.badlogic.gdx.backends.headless.HeadlessApplicationConfiguration;
import com.badlogic.gdx.net.HttpRequestBuilder;
import com.badlogic.gdx.net.Socket;
import com.badlogic.gdx.utils.Json;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.PrintWriter;
import java.util.concurrent.atomic.AtomicBoolean;
public class ServerTest {
private static final String TAG = "ServerTest";
@Before
public void setUp() throws Exception {
HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration();
new HeadlessApplication(new ServerBrowser(), config);
}
@After
public void tearDown() throws Exception {
Gdx.app.exit();
}
@Test
public void testGetGames() {
final AtomicBoolean done = new AtomicBoolean();
final Net.HttpRequest request = new HttpRequestBuilder()
.newRequest()
.method(Net.HttpMethods.GET)
.url("http://hydra:6112/get-sessions")
.build();
Gdx.net.sendHttpRequest(request, new Net.HttpResponseListener() {
@Override
public void handleHttpResponse(Net.HttpResponse httpResponse) {
Gdx.app.log(TAG, httpResponse.getResultAsString());
done.set(true);
}
@Override
public void failed(Throwable t) {
done.set(true);
}
@Override
public void cancelled() {
done.set(true);
}
});
while (!done.get());
}
@Test
public void testCreateGame() {
final AtomicBoolean done = new AtomicBoolean();
Net.HttpRequest request = new HttpRequestBuilder()
.newRequest()
.method(Net.HttpMethods.POST)
.url("http://hydra:6112/create-session")
.jsonContent(new Session.Builder() {{
name = "test game";
password = "1111";
desc = "test desc";
}})
.build();
Gdx.net.sendHttpRequest(request, new Net.HttpResponseListener() {
@Override
public void handleHttpResponse(Net.HttpResponse httpResponse) {
Gdx.app.log(TAG, ObjectUtils.toString(httpResponse));
Gdx.app.log(TAG, httpResponse.getResultAsString());
done.set(true);
}
@Override
public void failed(Throwable t) {
Gdx.app.log(TAG, ObjectUtils.toString(t));
done.set(true);
}
@Override
public void cancelled() {
Gdx.app.log(TAG, "cancelled");
done.set(true);
}
});
while (!done.get()) ;
}
@Test
public void testLogin() {
final AtomicBoolean done = new AtomicBoolean();
Net.HttpRequest request = new HttpRequestBuilder()
.newRequest()
.method(Net.HttpMethods.POST)
.url("http://hydra:6112/login")
.jsonContent(new Account.Builder() {{ account = "test"; }})
.build();
Gdx.net.sendHttpRequest(request, new Net.HttpResponseListener() {
@Override
public void handleHttpResponse(Net.HttpResponse httpResponse) {
Gdx.app.log(TAG, ObjectUtils.toString(httpResponse));
Gdx.app.log(TAG, httpResponse.getResultAsString());
done.set(true);
}
@Override
public void failed(Throwable t) {
Gdx.app.log(TAG, ObjectUtils.toString(t));
done.set(true);
}
@Override
public void cancelled() {
Gdx.app.log(TAG, "cancelled");
done.set(true);
}
});
while (!done.get()) ;
}
@Test
public void testConnect() {
final AtomicBoolean done = new AtomicBoolean();
Net.HttpRequest request = new HttpRequestBuilder()
.newRequest()
.method(Net.HttpMethods.POST)
.url("http://hydra:6112/create-session")
.jsonContent(new Session.Builder() {{
name = "test game";
password = "1111";
desc = "test desc";
}})
.build();
Gdx.net.sendHttpRequest(request, new Net.HttpResponseListener() {
@Override
public void handleHttpResponse(Net.HttpResponse httpResponse) {
Session session = new Json().fromJson(Session.class, httpResponse.getResultAsString());
Gdx.app.log(TAG, httpResponse.getResultAsString());
Socket socket = null;
try {
socket = Gdx.net.newClientSocket(Net.Protocol.TCP, session.host, session.port, null);
} finally {
if (socket != null) socket.dispose();
}
done.set(true);
}
@Override
public void failed(Throwable t) {
Gdx.app.log(TAG, ObjectUtils.toString(t));
done.set(true);
}
@Override
public void cancelled() {
Gdx.app.log(TAG, "cancelled");
done.set(true);
}
});
while (!done.get());
}
@Test
public void testDisconnect() {
final AtomicBoolean done = new AtomicBoolean();
Net.HttpRequest request = new HttpRequestBuilder()
.newRequest()
.method(Net.HttpMethods.POST)
.url("http://hydra:6112/create-session")
.jsonContent(new Session.Builder() {{
name = "test game";
password = "1111";
desc = "test desc";
}})
.build();
Gdx.net.sendHttpRequest(request, new Net.HttpResponseListener() {
@Override
public void handleHttpResponse(Net.HttpResponse httpResponse) {
Session session = new Json().fromJson(Session.class, httpResponse.getResultAsString());
Socket socket = null;
try {
socket = Gdx.net.newClientSocket(Net.Protocol.TCP, session.host, session.port, null);
Gdx.app.log(TAG, "Connected: " + socket.isConnected());
new PrintWriter(socket.getOutputStream(), true).println("test");
try {
Thread.sleep(500);
} catch (InterruptedException ignored) {}
} finally {
Gdx.app.log(TAG, "disconnecting...");
if (socket != null) {
//IOUtils.closeQuietly(socket.getInputStream());
IOUtils.closeQuietly(socket.getOutputStream());
socket.dispose();
}
}
try {
Thread.sleep(500);
} catch (InterruptedException ignored) {}
done.set(true);
}
@Override
public void failed(Throwable t) {
Gdx.app.log(TAG, ObjectUtils.toString(t));
done.set(true);
}
@Override
public void cancelled() {
Gdx.app.log(TAG, "cancelled");
done.set(true);
}
});
while (!done.get()) ;
}
}