package com.stardust.scriptdroid.sublime; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.greenrobot.eventbus.EventBus; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.util.concurrent.Executor; import java.util.concurrent.Executors; /** * Created by Stardust on 2017/5/10. */ public class SublimePluginClient { public static class ConnectionStateChangeEvent { private boolean mConnected; public ConnectionStateChangeEvent(boolean connected) { mConnected = connected; } public boolean isConnected() { return mConnected; } } private Socket mSocket; private Handler mResponseHandler; private String host; private int port; private OutputStream mOutputStream; private Executor mExecutor; public SublimePluginClient(String host, int port) { this.host = host; this.port = port; } public void setResponseHandler(Handler handler) { mResponseHandler = handler; } public void listen() { if (mSocket != null) { throw new IllegalStateException("Socket listening "); } new Thread(new Runnable() { @Override public void run() { try { mSocket = new Socket(host, port); EventBus.getDefault().post(new ConnectionStateChangeEvent(true)); mSocket.setTcpNoDelay(true); mOutputStream = mSocket.getOutputStream(); startReadLoop(mSocket.getInputStream()); } catch (IOException e) { e.printStackTrace(); } finally { tryClose(); } } }).start(); } private void tryClose() { try { close(); } catch (IOException e) { e.printStackTrace(); } } public void send(final JsonObject object) { if (mSocket == null) { throw new IllegalStateException("Socket is not listening "); } if (mExecutor == null) { mExecutor = Executors.newSingleThreadExecutor(); } mExecutor.execute(new Runnable() { @Override public void run() { try { mOutputStream.write(object.toString().getBytes()); mOutputStream.write("\n".getBytes()); mOutputStream.flush(); } catch (IOException e) { e.printStackTrace(); tryClose(); } } }); } public void close() throws IOException { if (mSocket != null) { mSocket.close(); mSocket = null; mOutputStream = null; EventBus.getDefault().post(new ConnectionStateChangeEvent(false)); } } private void startReadLoop(InputStream stream) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); while (!Thread.currentThread().isInterrupted()) { String line = reader.readLine(); if (line == null) { return; } if (mResponseHandler != null) { JsonElement jsonElement = new JsonParser().parse(line); JsonObject jsonObject = jsonElement.getAsJsonObject(); mResponseHandler.handle(jsonObject); } } } }