public class

JsonWebSocketHandler

extends JsonHandler
package edu.stanford.junction.provider.jx.json;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.json.JSONException;
import org.json.JSONObject;

import edu.stanford.junction.provider.jx.JXServer.Log;

/**
 * Helps read and write json messages over a WebSocket.
 *
 */
public class JsonWebSocketHandler extends JsonHandler {
	private static final int BUFFER_SIZE = 1024;
	
	private final OutputStream out;
	private final InputStream in;
	
	public JsonWebSocketHandler(InputStream in, OutputStream out) {
		this.in = in;
		this.out = new BufferedOutputStream(out);
	}

	public void sendJson(JSONObject message) throws IOException {
    	byte[] bytes = message.toString().getBytes();
    	out.write(0x00);
		out.write(bytes, 0, bytes.length);
		out.write(0x000000FF);
		out.flush();
    }

	private byte[] buffer = new byte[BUFFER_SIZE];
	private int byteCount;
	
	/**
	 * Reads a JSON object from the handler's  inputStream.
	 * This method is not thread safe.
	 */
    public JSONObject jsonFromStream() throws IOException {
		while (true) {
            try {
            	byteCount = in.read(buffer);
            	if (byteCount == -1) {
            		break;
            	}
            	
            	if (buffer[0] != 0x00) {
            		Log.e(TAG, "Bad frame header found in WebSocket connection");
            		continue;
            	}
            	
            	if (buffer[byteCount-1] != (byte)0x000000FF) {
            		Log.e(TAG, "Bad frame footer found in WebSocket connection");
            		continue;
            	}
            	
            	String str = new String(buffer, 1, byteCount - 2);
            	Log.d(TAG, "read " + str);
                JSONObject json = new JSONObject(str);
                
                if (json == null) {
                	continue; // break?
                }
                
                return json;
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                //connectionLost();
                break;
            } catch (JSONException e) {
				Log.e(TAG, "Not a JSON message." + e);
			}
        }
		return null;
    }
}