package javaforce.service;
/** WebSocket
*
* @author pquiring
*
* See : RFC 6455
*/
import java.io.*;
import javaforce.JFLog;
public class WebSocket {
protected InputStream is;
protected OutputStream os;
protected String url;
public static final int TYPE_CONT = 0x0; //do not use
public static final int TYPE_TEXT = 0x1;
public static final int TYPE_BINARY = 0x2;
protected static final int TYPE_CLOSE = 0x08;
protected static final int TYPE_PING = 0x09;
protected static final int TYPE_PONG = 0x0a;
public static final int FIN = 0x80;
public static final int MASK = 0x80;
/** Free to use data */
public Object userobj;
/** Returns URL used during WebSocket connection request. */
public String getURL() {
return url;
}
/** Writes a WebSocket message to client.
* Type = TYPE_TEXT
*/
public void write(byte msg[]) {
write(msg, TYPE_TEXT);
}
/** Writes a WebSocket message to client.
* @param type = TYPE_...
*/
public void write(byte msg[], int type) {
try {
//encode a packet and write it
int len = msg.length;
if (len > 16777216) {
throw new Exception("WebSocket message > 16MB");
}
if (len > 65535) {
//create 64bit packet length
byte header[] = new byte[10];
header[0] = (byte)(FIN | type);
header[1] = 127;
//bytes 2-6 : not supported (64bit length), only support 24bit
header[7] = (byte)((len & 0xff0000) >> 16);
header[8] = (byte)((len & 0xff00) >> 8);
header[9] = (byte)(len & 0xff);
os.write(header);
} else if (len >= 126) {
//create 16bit packet length
byte header[] = new byte[4];
header[0] = (byte)(FIN | type);
header[1] = 126;
header[2] = (byte)((len & 0xff00) >> 8);
header[3] = (byte)(len & 0xff);
os.write(header);
} else {
//create 7bit packet length
byte header[] = new byte[2];
header[0] = (byte)(FIN | type);
header[1] = (byte)len;
os.write(header);
}
os.write(msg);
} catch (Exception e) {
JFLog.log(e);
}
}
}