Skip to content

Instantly share code, notes, and snippets.

@sirolf2009
Last active November 6, 2015 15:10
Show Gist options
  • Save sirolf2009/afdedd2f88dc31e61d54 to your computer and use it in GitHub Desktop.
Save sirolf2009/afdedd2f88dc31e61d54 to your computer and use it in GitHub Desktop.
A rest api based socket client
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import com.google.android.gms.nearby.messages.Message;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonSyntaxException;
public class Client {
private String host;
private String ID;
private boolean connected;
private Parser parser;
private List<Listener> listeners;
public Client() {
listeners = new ArrayList<Listener>();
parser = new Parser();
}
public void connect(String host, int port) {
this.host = host+":"+port;
connect();
}
private void connect() {
ID = request("/register").body;
connected = true;
for(Listener listener : listeners) {
try {
listener.connected();
} catch(Exception e) {
e.printStackTrace();
}
}
new Thread(new Runnable() {
@Override
public void run() {
while(connected) {
Response response = request("/fetch/"+ID);
if(response.statusCode == 400) {
System.out.println("Disconnecting");
connected = false;
for(Listener listener : listeners) {
try {
listener.disconnected();
} catch(Exception e) {
e.printStackTrace();
}
}
} else if(response.body == null) {
System.err.println("No data received");
} else {
try {
JsonArray array = parser.getGson().fromJson(response.body, JsonArray.class);
if(array.size() > 0) {
for(JsonElement element : array) {
Object object = parser.parse(element);
if(object == null) {
System.err.println("Could not parse object");
} else {
for(Listener listener : listeners) {
listener.received(object);
}
}
}
}
} catch(JsonSyntaxException e) {
System.err.println("Malformed json");
e.printStackTrace();
}
}
try {
Thread.sleep(5000);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
public void close() {
connected = false;
request("/unregister/"+ID);
}
public void addListener(Listener listener) {
listeners.add(listener);
}
public void sendTCP(Object object) {
if(!connected) {
while(!connected) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("Sending "+object);
InputStream in = null;
try {
URL url = new URL(host+"/push/"+ID);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
parser.getGson().toJson(object, new PrintWriter(conn.getOutputStream()));
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
public Response request(String path) {
Response response = new Response();
InputStream is = null;
try {
URL url = new URL(host+path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
response.statusCode = conn.getResponseCode();
if(response.statusCode == 200) {
StringBuffer buffer = new StringBuffer();
is = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while((line = reader.readLine()) != null) {
buffer.append(line);
}
response.body = buffer.toString();
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
return response;
}
public class Response {
public String body;
public int statusCode;
}
public class Parser {
private Gson gson;
public Parser() {
gson = new Gson();
}
public Object parse(JsonElement body) {
//TODO add your classes here
try {
return gson.fromJson(body, Message.class);
} catch(JsonSyntaxException e) {}
return null;
}
public Gson getGson() {
return gson;
}
public void setGson(Gson gson) {
this.gson = gson;
}
}
public interface Listener {
public void connected();
public void received(Object object);
public void disconnected();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment