package com.cardshifter.gdx; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Net; import com.badlogic.gdx.net.Socket; import com.badlogic.gdx.net.SocketHints; import com.cardshifter.api.incoming.LoginMessage; import com.cardshifter.api.messages.Message; import com.cardshifter.api.serial.ByteTransformer; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CardshifterNonGWTClient implements Runnable, CardshifterClient { private final Socket socket; private final OutputStream output; private final InputStream input; private final ByteTransformer transformer; private final CardshifterMessageHandler handler; public CardshifterNonGWTClient(CardshifterPlatform platform, String host, int port, CardshifterMessageHandler handler, LoginMessage loginMessage) { socket = Gdx.net.newClientSocket(Net.Protocol.TCP, host, port, new SocketHints()); output = socket.getOutputStream(); input = socket.getInputStream(); transformer = new ByteTransformer(new GdxLogger(), new GdxReflection()); this.handler = handler; try { output.write("{ \"command\": \"serial\", \"type\": \"1\" }".getBytes()); output.flush(); Gdx.app.log("Client", "Sent serial type"); platform.setupLogging(); send(loginMessage); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } new Thread(this).start(); } @Override public void run() { try { DataInputStream dataIn = new DataInputStream(input); while (true) { try { Message message = transformer.readOnce(dataIn); Gdx.app.log("Client", "Received: " + message); handler.handle(message); } catch (Exception e) { Gdx.app.log("Client", "Error inside read loop", e); e.printStackTrace(); break; } } } catch (Exception ex) { Gdx.app.log("Client", "Error outside read loop", ex); } Gdx.app.log("Client", "Stopped listening"); } public void send(Message message) { try { transformer.send(message, output); Gdx.app.log("Outgoing", message.toString()); output.flush(); } catch (Throwable e) { Gdx.app.log("Outgoing", "Error " + e); e.printStackTrace(); } } }